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 子进程模块中过滤掉需要终端的命令

python子进程中shell = True或False之间的区别[重复]

如何为python安装子进程模块?

如何在asyncio python中使用子进程模块限制并发进程数

管道时在python的子进程模块中使用stdout.close()

python子进程模块subprocess详解与应用实例 之三