python:子进程模块中带有shell = True或shell = False的stderr
Posted
技术标签:
【中文标题】python:子进程模块中带有shell = True或shell = False的stderr【英文标题】:python: stderr with shell=True or shell=False in subprocess module 【发布时间】:2018-01-15 03:55:18 【问题描述】:我一直在用 subprocess 模块测试标准错误。如果我用 linux shell 命令ls
写一个简单的 shell=True 测试,故意输入错误:
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
我认为它会给我相同的输出。代码是错误的还是我应该获得相同的标准错误的观点?
注意:以防万一我也尝试过使用 python3
【问题讨论】:
用于启动命令的机制在这两种情况下非常不同。为什么您期望错误诊断完全相同? "lr: command not found" 是一个 shell 错误消息。如果你不使用 shell,那么你就没有 shell 来为你显示 shell 错误消息。 但我希望程序至少运行,然后弹出一些错误。并不是说它根本无法运行。所以你不知道我用python输入错误命令的情况吗?我还听说使用shell=True
可能会有风险
【参考方案1】:
使用shell=True
,Python 启动一个shell 并告诉shell 运行lr
。 shell 运行正常,找不到lr
程序,并产生错误输出报告此故障。
使用shell=False
,Python 会尝试直接运行lr
。由于没有lr
程序可以运行,Python找不到lr
对应的可执行文件。 Python 根本无法启动子进程,并且没有可供读取的 stdout 或 stderr 流。 Python 引发异常,报告找不到文件。
这种行为是正常的,也是意料之中的。
【讨论】:
好吧,最后,我猜是程序内部的错误总是让它无法执行。感谢您的回答以上是关于python:子进程模块中带有shell = True或shell = False的stderr的主要内容,如果未能解决你的问题,请参考以下文章
python子进程中shell = True或False之间的区别[重复]
如何在asyncio python中使用子进程模块限制并发进程数