为什么`subprocess.Popen`会向shell返回不同的输出? - Windows

时间:2014-03-07 13:46:43

标签: python subprocess popen

如果我从cmd.exe运行以下命令,我会收到一条如下所示的错误消息:

C:\Users\user>ctaags --help
'ctaags' is not recognized as an internal or external command,
operable program or batch file.

现在,如果我使用Python的subprocess模块运行相同的命令,我会收到不同的警告:

>>> subprocess.Popen(['ctaags', '--help'])
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "c:\Python27\lib\subprocess.py", line 711, in __init__
    errread, errwrite)
  File "c:\Python27\lib\subprocess.py", line 948, in _execute_child
    startupinfo)
WindowsError: [Error 2] The system cannot find the file specified

根据其他命令,我希望Popen的输出完全匹配shell给我回来的内容,即:

WindowsError: [Error 2] 'ctaags' is not recognized as an internal or
external command, operable program or batch file.

事实并非如此。为什么呢?

2 个答案:

答案 0 :(得分:2)

运行该进程的系统调用返回错误2,无论它是由shell调用还是从Python调用。

在shell案例中, shell 会生成“无法识别”的消息。

使用subprocess.Popen()没有shell=True(你不应该使用),没有shell,所以你自己得到原始错误代码。

答案 1 :(得分:1)

除非你设置shell = True:

,否则Popen不会使用shell执行命令
subprocess.Popen(['ctaaags', '--help'], shell=True)