首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我应该如何在Python织物中使用extglob?

我应该如何在Python织物中使用extglob?
EN

Stack Overflow用户
提问于 2022-03-06 05:28:30
回答 2查看 77关注 0票数 0

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

当我跑步时:

代码语言:javascript
复制
c.run(f"shopt -s extglob dotglob && rm -Rf {project_path}* !(.|..|.venv) && shopt -u extglob dotglob")

我知道这个错误:

代码语言:javascript
复制
`bash: -c: line 0: syntax error near unexpected token `('`

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

代码语言:javascript
复制
`c.run("shopt -s extglob dotglob && shopt")`

它打印出选项列表,并启用了extglob和dotglob。

我哪里出问题了?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-03-08 12:09:46

不幸的是,extglob似乎不能与Python一起使用。

来自bash文档

extglob更改某些字符的解析方式。在和后续命令之间必须有一个(而不仅仅是分号)才能使用它。

但是来自织物文档

虽然Fabric可以用于许多类似shell脚本的任务,但是有一个有点不直观的问题:每个run .有自己独特的shell会话。为了让Fabric在命令运行后可靠地确定它的标准输出/错误和返回代码是什么,这是必需的。

幸运的是,使用Bash的GLOBIGNORE变量可以实现类似的事情

GLOBIGNORE变量可用于限制匹配模式的文件名集。如果设置了GLOBIGNORE,则从匹配列表中删除与GLOBIGNORE中的模式之一匹配的每个文件名。如果设置了nocaseglob选项,则对GLOBIGNORE中的模式进行匹配而不考虑情况。文件名。然后..。在设置GLOBIGNORE和not null时总是被忽略。但是,将GLOBIGNORE设置为非空值的效果是启用dotglob shell选项,因此所有其他文件名都以‘.’开头。会匹配的。要获得忽略以“.”开头的文件名的旧行为,请将“.*”作为GLOBIGNORE中的模式之一。取消GLOBIGNORE时,将禁用dotglob选项。

在展开通配符时,这也很容易忽略...,因此要删除目录中的所有文件(“.venv”除外),我们可以这样做。

代码语言:javascript
复制
c.run("GLOBIGNORE='.venv'; rm -Rf {project_path}*")
票数 0
EN

Stack Overflow用户

发布于 2022-03-06 06:00:35

来自bash wiki

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

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

或者只做bash调用在python中直接做的事情。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71367899

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档