我一直在用子进程模块测试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
答案 0 :(得分:1)
使用shell=True
,Python启动一个shell并告诉shell运行lr
。 shell运行得很好,无法找到lr
程序,并产生报告此失败的错误输出。
使用shell=False
,Python会尝试直接运行lr
。由于没有lr
程序可以运行,因此Python无法找到与lr
对应的可执行文件。 Python根本无法启动子进程,并且没有要读取的stdout或stderr流。 Python引发了一个异常,报告它无法找到该文件。
此行为是正常的并且是预期的。