【发布时间】:2013-12-25 09:53:06
【问题描述】:
提交由完整文件路径组成的复杂 cmd 字符串到可执行文件,多个标志、参数、参数、输入和输出似乎需要我设置 shell=True 否则 subprocess.Popen 无法理解比简单的可执行路径更复杂的东西(文件路径中没有空格)。
在我的示例中,我有一个很长的 cmd:
cmd = " '/Application/MyApp.app/Contents/MacOS/my_executable' '/Path/to/input/files' -some -flags -here -could -be -a -lot '/full/path/to/output/files' "
将此 cmd 提交到 subprocess.Popen ”会导致错误,该错误抱怨有关路径的某些内容并且无法找到它。
所以不要使用:
proc = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
check_call 似乎运作良好:
proc = subprocess.check_call(cmd, shell=True)
有趣,只有在 shell 设置为 True
shell=True
subprocess.check_call 与提供的 cmd 一起工作。
副作用是其余代码似乎继续运行而无需等待 subprocess.check_call(cmd, shell=True) 首先完成。
代码的设计方式是其余的执行取决于subprocess.check_call(cmd, shell=True) 的结果。
我想知道是否有强制执行代码等到 subprocess.check_call(cmd, shell=True) 完成。提前致谢!
【问题讨论】:
-
您是否尝试在使用
shell=False和subprocess.Popen运行时将cmd转换为列表?您可以使用shlex.split()函数来执行此操作,就像documentation of the Popen constructor 中提供的示例代码一样。
标签: python subprocess popen