当试图使用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中(例如dir或copy )。不需要shell=True
来运行批处理文件或基于控制台的可执行文件。警告:如果与不可信输入结合使用,传递
shell=True
可能会带来安全隐患。 有关详细信息,请参阅常用参数下的警告。 “