【问题标题】:Shell expansion in subprocess? [duplicate]子进程中的外壳扩展? [复制]
【发布时间】:2013-01-07 01:48:16
【问题描述】:

可能重复:
Python subprocess wildcard usage

使用 Python 2.6 子进程模块,我需要对我使用先前子进程调用构建的 src.rpm 文件运行命令。

不幸的是,我正在使用不一致的规范文件,所以我对 src.rpm 的文件名应该是什么样子只有一个模糊的概念(例如,我知道包的名称和扩展名名为“{package}-{version}.src.rpm”但不是版本)。

不过,我知道,我正在查找的目录中只有一个 src.rpm 文件,因此我可以使用类似

的命令调用 mock

mock {options} *.src.rpm

并让它在 shell 中工作,但子进程似乎不想接受扩展。我尝试使用 (shell=True) 作为 subprocess.call() 的参数,但即使它有效,我也宁愿避免它。

我如何得到类似的东西

subprocess.call("mock *.src.rpm".split())

跑?

【问题讨论】:

  • 我认为您遇到的问题是因为通配符文件名在创建命令之前由操作系统处理,因此您必须自己查找文件名并将它们全部传递到命令行。
  • 您可能还想尝试调用 subprocess.Popen,但我不确定它是否能解决您的问题,本教程展示了一个示例:dreamsyssoft.com/python-scripting-tutorial/shell-tutorial.php
  • 您可以通过glob.glob('*.src.rpm') 获取文件名列表,这将返回一个列表。然后你只需要在前面加上一个mock...

标签: python shell python-2.6


【解决方案1】:

使用glob 包:

import subprocess    
from glob import glob
subprocess.call(["mock"] + glob("*.src.rpm"))

【讨论】:

    【解决方案2】:

    通配符 * 必须由 SHELL 解释。当你运行 subprocess.call 时,默认情况下它不会加载 shell,但你可以给它shell=True 作为参数:

    subprocess.call("mock *.src.rpm".split(), shell=True)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多