我尝试通过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')
程序按预期执行。显然我的语法有问题,但是我不知道是什么。 。
任何见识将不胜感激!
答案 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
。第二个是修复两张图片My
和Pictures\picture1.jpg
。
有关args
参数的更多详细信息,请参见Frequently Used Arguments。请注意,“一个大字符串”版本实际上在没有shell=True
的情况下是无效的,即使它通常在Windows上也可以正常使用。
1。在Windows上,事情要比这复杂一些,因为subprocess
实际上必须获取所有的args并弄清楚如何将它们组合成一个字符串,以便可以将它们解析为实际的单独值。你要的。但是没关系。