Python 子流程中的Shell扩展?
可能重复:Python 子流程中的Shell扩展?,python,shell,python-2.6,Python,Shell,Python 2.6,可能重复: 使用Python2.6子流程模块,我需要在使用前一个子流程调用生成的src.rpm文件上运行一个命令 不幸的是,我使用的规范文件不一致,因此我对src.rpm的文件名应该是什么样子只有模糊的概念(例如,我知道包的名称和名为“{package}-{version}.src.rpm”的扩展名,但不知道版本) 但是,我知道在我正在查找的目录中只有一个src.rpm文件,因此我可以使用如下命令调用mock mock{options}*.src.rpm 让它在shell中工作,但子流程似乎不
使用Python2.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())
要运行?请使用
glob
包:
import subprocess
from glob import glob
subprocess.call(["mock"] + glob("*.src.rpm"))
通配符*必须由SHELL解释。当您运行subprocess.call时,默认情况下它不会加载shell,但您可以将它作为参数指定为
shell=True
:
subprocess.call("mock *.src.rpm".split(), shell=True)
我认为您遇到的问题是,在创建命令之前,操作系统会处理通配符文件名,因此您必须自己查找文件名并在命令行上传递所有文件名。您可能还想尝试调用subprocess.Popen,我不确定它是否能解决您的问题,本教程展示了一个示例:您可以通过
glob.glob('*.src.rpm')
获取文件名列表,该列表将返回一个列表。然后你只需要在那里预先准备一个mock
。。。