【问题标题】:Traceback error when using subprocess in Python在 Python 中使用子进程时出现回溯错误
【发布时间】:2015-03-25 12:26:00
【问题描述】:

在尝试使用 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 中工作吗?
  • 是的,echo 有效,但事实并非如此。子进程下的所有命令都会发生这种情况。
  • @AshwiniChaudhary 你一直都是对的。 echo 在 Windows 上不是可执行文件。

标签: python windows subprocess


【解决方案1】:

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

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

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

因为 notepad.exe 是可执行文件。但在 Windows 中,echo 只能从 shell 提示符内调用,因此使其工作的捷径是使用 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命令)

但是,正如@J.F.Sebastian 亲切地指出的那样,for portability a string, and not a list, should be used to pass arguments when using shell=True(查看那里的问题链接)。因此,在您的情况下调用 subprocess.check_output 的最佳方法是:

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

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

docs 说:

"在带有shell=True 的 Windows 上,COMSPEC 环境变量 指定默认外壳。唯一需要指定的时间 Windows 上的shell=True 是构建您希望执行的命令的时间 进入外壳(例如 dircopy)。您不需要shell=True 来运行 批处理文件或基于控制台的可执行文件。

警告:传递 shell=True 如果与不受信任相结合,可能会带来安全隐患 输入。有关详细信息,请参阅 Frequently Used Arguments 下的警告。 "

【讨论】:

猜你喜欢
  • 2018-06-23
  • 1970-01-01
  • 2018-02-12
  • 1970-01-01
  • 2020-06-19
  • 2017-04-13
  • 1970-01-01
  • 1970-01-01
  • 2016-11-20
相关资源
最近更新 更多