子进程中的Shell扩展?
可能重复的问题:
Python subprocess 通配符用法
我在用 Python 2.6 的 subprocess 模块,想要对一个我之前用 subprocess 创建的 src.rpm 文件执行一个命令。
不过,我正在处理的 spec 文件不太一致,所以我对 src.rpm 文件的名字只有个大概的印象(比如,我知道包的名字和扩展名是 "{package}-{version}.src.rpm",但不清楚版本号是什么)。
不过,我知道在我查找的目录里只会有一个 src.rpm 文件,所以我可以用类似这样的命令来调用 mock:
mock {options} *.src.rpm
这个命令在命令行中可以正常工作,但 subprocess 似乎不接受这种通配符扩展。我试过在 subprocess.call() 中加上 (shell=True) 这个参数,但即使这样能工作,我也不太想用它。
我该如何让类似下面的代码:
subprocess.call("mock *.src.rpm".split())
能够运行呢?
2 个回答
4
在这里,星号 * 是一个通配符,它需要由命令行的外壳程序来理解。当你使用 subprocess.call 这个命令时,默认情况下它不会加载外壳程序,但你可以通过给它加上 shell=True
这个参数来让它使用外壳程序:
subprocess.call("mock *.src.rpm".split(), shell=True)
8
使用 glob
这个包:
import subprocess
from glob import glob
subprocess.call(["mock"] + glob("*.src.rpm"))