从python中的subprocess.Popen调用程序:`OSError:..没有这样的文件或目录`

时间:2016-02-09 12:30:37

标签: python subprocess

我从bash脚本运行以下命令:

myProgram --name test1 --index 0

但是现在我想在python脚本中运行它,所以我尝试了以下内容:

#!/usr/bin/python
from threading import Thread
import time
import subprocess

print "hello Python"

subprocess.Popen("myProgram --name test1 --index 0")

但我收到错误:

hello Python
Traceback (most recent call last):
File "./myPythonProgram.py", line 8, in <module>
subprocess.Popen("myProgram --name test1 --index 0")
File "/usr/lib64/python2.6/subprocess.py", line 623, in __init__
errread, errwrite)
File "/usr/lib64/python2.6/subprocess.py", line 1141, in _execute_child
raise child_exception
OSError: [Errno 2] No such file or directory

这是调用它的正确方法吗?

2 个答案:

答案 0 :(得分:2)

您需要将命令作为列表传递:

subprocess.Popen("myProgram --name test1 --index 0".split())

修改

str.split()不会考虑shell元字符/标记,因此不安全。您应该使用shlex.split()代替:

import shlex

command = shlex.split("myProgram --name test1 --index 0")
subprocess.Popen(command)

答案 1 :(得分:2)

您需要将其作为list传递,或者您需要将参数设为shell=True

试试这个:

output = subprocess.Popen("myProgram --name test1 --index 0", shell=True, universal_newlines=True)
out, err = output.communicate()

print(out)

universal_newlines参数将输出作为字符串,而不会将输出中的换行符更改为\n

如果您不想将输出存储在变量中并且只想在控制台中获取输出,请尝试subprocess.call()subprocess.run(),如果您有 Python 3.5