社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

我应该如何在Python结构中使用extglob?

Ben • 3 年前 • 1459 次点击  

我试图使用fabric(v2.6)来运行一些命令,这些命令使用bash的extglob和dotglob。

当我跑步时:

c.run(f"shopt -s extglob dotglob && rm -Rf {project_path}* !(.|..|.venv) && shopt -u extglob dotglob")

我得到了这个错误:

`bash: -c: line 0: syntax error near unexpected token `('`

我用的是 && 因为我发现 shopt -s extglob dotglob 在单独的运行调用中,后续运行调用不会持续。我很确定 && 正在启用extglob和dotglob,因为当我这样做时:

`c.run("shopt -s extglob dotglob && shopt")`

它打印出选项列表,extglob和dotglob都已启用。

我哪里做错了?

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/130363
 
1459 次点击  
文章 [ 2 ]  |  最新文章 3 年前
Ben
Reply   •   1 楼
Ben    3 年前

看来 extglob 不幸的是,不能与Python Fabric一起使用。

bash docs

extglob 更改某些字符的解析方式。这是必要的 有一个 新线 ( 不仅仅是分号 )中间 shopt -s extglob 和 使用它的任何后续命令。

但是从 Fabric docs

虽然Fabric可以用于许多类似shell脚本的任务,但有一个 稍微不敏感的捕获:每个 run [...] 有 它自己独特的shell会话 .这是必需的 为了让Fabric可靠地计算出 运行,它的标准输出/错误和返回代码是什么。

幸运的是,可以使用Bash的GLOBIGNORE shell变量实现类似的功能

GLOBIGNORE shell变量可用于限制文件集 匹配模式的名称。如果设置了GLOBIGNORE,则每个匹配的文件 与GLOBIGNORE中的模式之一匹配的名称将被删除 从匹配列表中。如果设置了nocaseglob选项,则 根据GLOBIGNORE中的模式进行匹配时不需要 关于这个案子。文件名。和当 GLOBIGNORE已设置且不为空。但是,将GLOBIGNORE设置为 非null值具有启用dotglob shell选项的效果,因此 以a开头的所有其他文件名。会匹配的。去变老 忽略以..开头的文件名的行为。,制造。*什么之中的一个 Global中的模式被忽略。在以下情况下,dotglob选项将被禁用: 这是不确定的。

这也容易忽略 . .. 扩展通配符时,删除所有文件-除了'。在一个目录中,我们可以

c.run("GLOBIGNORE='.venv'; rm -Rf {project_path}*")
shawn
Reply   •   2 楼
shawn    3 年前

从…起 the bash wiki :

extglob 更改某些字符的解析方式。之间必须有一个换行符(而不仅仅是分号) shopt -s extglob 以及使用它的任何后续命令。

因此,您必须适当地更改python代码,以便使用换行符而不是 && .

或者直接在python中执行bash调用所做的操作。