python:在子进程模块中使用shell = True或shell = False的stderr

时间:2017-08-07 18:44:23

标签: python subprocess stderr

我一直在用子进程模块测试stderr。如果我用shell shell命令编写一个简单的测试,并使用linux shell命令ls故意输入错误:

p=subprocess.Popen(["lr"],stdout=subprocess.PIPE,stderr=subprocess.PIPE,shell=True)
out, err=p.communicate()
print ("standard error")
print(err)

它输出shell中的常用内容:lr: command not found

但如果shell=False,我不太明白为什么程序执行错误

Traceback (most recent call last):
   File "importInteresantes.py", line 6, in <module>
      p=subprocess.Popen(["lr"],stdout=subprocess.PIPE,stderr=subprocess.PIPE,shell=False)
   File "/usr/lib/python2.7/subprocess.py", line 390, in __init__
errread, errwrite)
   File "/usr/lib/python2.7/subprocess.py", line 1024, in _execute_child
raise child_exception
OSError: [Errno 2] No such file or directory

我认为它会给我相同的输出。代码是错误的还是我应该获得相同的stderr的观点?

注意:以防万一我也试过python3

1 个答案:

答案 0 :(得分:1)

使用shell=True,Python启动一个shell并告诉shell运行lr。 shell运行得很好,无法找到lr程序,并产生报告此失败的错误输出。

使用shell=False,Python会尝试直接运行lr。由于没有lr程序可以运行,因此Python无法找到与lr对应的可执行文件。 Python根本无法启动子进程,并且没有要读取的stdout或stderr流。 Python引发了一个异常,报告它无法找到该文件。

此行为是正常的并且是预期的。