在Python中使用subprocess时回溯错误

当试图使用subprocess.check_output,我不断收到这个回溯错误:

Traceback (most recent call last): File "<pyshell#1>", line 1, in <module> subprocess.check_output(["echo", "Hello World!"]) File "C:\Python27\lib\subprocess.py", line 537, in check_output process = Popen(stdout=PIPE, *popenargs, **kwargs) File "C:\Python27\lib\subprocess.py", line 679, in __init__ errread, errwrite) File "C:\Python27\lib\subprocess.py", line 896, in _execute_child startupinfo) WindowsError: [Error 2] The system cannot find the file specified 

这甚至发生在我尝试时:

 >>>subprocess.check_output(["echo", "Hello World!"]) 

这恰好是文档中的示例。

由于ECHO内置在Windows cmd shell中,所以不能像调用可执行文件那样直接调用Python(或者直接调用Linux)。

即这应该在你的系统中工作:

 import subprocess subprocess.check_output(['notepad']) 

因为notepad.exe是一个可执行文件。 但是在Windows中,只能在shell提示符下调用echo ,因此使其工作的简短方法是使用shell=True 。 为了保持对你的代码的信任,我将不得不写

 subprocess.check_output(['echo', 'hello world'], shell=True) # Still not perfect 

(这个,在subprocess.py的第924行的条件之后将args扩展到全行'C:\\Windows\\system32\\cmd.exe /c "echo "hello world""' ,从而调用cmd shell并使用shell的echo命令)

但是,正如@JFSebastian所指出的那样, 为了便于携带,在使用shell=True时,应该使用一个字符串而不是一个列表来传递参数 (查看指向那里的问题的链接)。 所以在你的情况下调用subprocess.check_output的最好方法是:

 subprocess.check_output('echo "hello world"', shell=True) 

args字符串又是正确的, 'C:\\Windows\\system32\\cmd.exe /c "echo "hello world""' ,您的代码更加便携。

文档说:

“在shell=True Windows上,COMSPEC环境变量指定了默认的shell,在Windows上只需要指定shell=True ,就是当你想执行的命令被内置到shell中(例如dircopy )。不需要shell=True来运行批处理文件或基于控制台的可执行文件。

警告:如果与不可信输入结合使用,传递shell=True可能会带来安全隐患。 有关详细信息,请参阅常用参数下的警告。 “