Py学习  »  Python

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

Ben • 3 年前 • 1610 次点击  

我试图使用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
 
1610 次点击  
文章 [ 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调用所做的操作。