Python Popen()问题(语法?)

时间:2018-08-02 05:08:26

标签: python subprocess popen os.path

我尝试通过Popen()从Python脚本启动的程序有一个小问题(我理解Popen()可能不是理想的,但是我正在使用某些在其他实例中使用的模板,并且想要遵守惯例)。

我有点困惑,因为我似乎无法执行以下操作:

root = os.getcwd()

bin = 'my_executable.exe'

bin_fullpath = os.path.join(root,bin)

params = 'Option C -f Module -y -q'

p = subprocess.Popen([bin_fullpath,params])

out = p.communicate()

程序启动,但是退出,错误代码为1(我通过check_call进行了检查)。

但是,当我放弃上述方法时,只需提供我需要运行的整个字符串,如下所示:

subprocess.Popen(r'C:\Users\me\Desktop\path\to\tool\my_executable.exe Option C -f Module -y -q')

程序按预期执行。显然我的语法有问题,但是我不知道是什么。 。

任何见识将不胜感激!

1 个答案:

答案 0 :(得分:4)

使用“参数列表”格式时,每个参数都必须是自己的字符串,作为列表的单独成员,如下所示:

params = ['Option', 'C', '-f', 'Module', '-y', '-q']
p = subprocess.Popen([bin_fullpath, *params])

将它们全部放在一个字符串中时,就是在告诉subprocess它们都是一个大参数。 1 因此,与其粗略地等同于此命令行:

C:\Users\me\Desktop\path\to\tool\my_executable.exe Option C -f Module -y -q

...这与这个大致相同:

C:\Users\me\Desktop\path\to\tool\my_executable.exe "Option C -f Module -y -q"

如果不清楚为什么会有所不同,请考虑以下示例:

fix.exe "My Pictures\picture1.jpg"
fix.exe My Pictures\picture1.jpg

第一个是固定一张图片,My Pictures\picture1.jpg。第二个是修复两张图片MyPictures\picture1.jpg


有关args参数的更多详细信息,请参见Frequently Used Arguments。请注意,“一个大字符串”版本实际上在没有shell=True的情况下是无效的,即使它通常在Windows上也可以正常使用。


1。在Windows上,事情要比这复杂一些,因为subprocess实际上必须获取所有的args并弄清楚如何将它们组合成一个字符串,以便可以将它们解析为实际的单独值。你要的。但是没关系。