【问题标题】:Why does the shell output go to stderr?为什么 shell 输出到 stderr?
【发布时间】:2019-09-04 21:20:15
【问题描述】:

我正在使用 python 中的subprocess 模块,每当我调用子进程必须运行的任何方法时,在这种情况下,shell 上的一些 bash 代码,输出(假设来自命令,例如 iwconfig) 被重定向到 stderr

不应该将该命令的输出重定向到 stdout 而不是 stderr?正如我所说,这发生在像.Popen().check_output() 这样的任何方法上。 这个问题可能看起来是重复的,但我在论坛上找不到任何其他答案来解释为什么会发生这种情况。

stderr 参数设置为subprocess.STDOUT,因此我可以获取命令的输出。否则没有其他办法。无论如何,stderr 是输出错误所在,对吧?这对我来说没有意义......

s = subprocess.check_output("iwconfig", shell=True, universal_newlines=True, stderr=subprocess.STDOUT)

提前致谢。

【问题讨论】:

  • iwconfig 的一些输出将转到stderr。例如,如果您没有无线设备,那么iwconfig 的所有输出都是错误消息,并发送到stderr
  • 我不确定我明白你在问什么。谁在做你所说的这种“重定向”?您只是在谈论 subprocess 模块对 stderr 和 stdout 的作用吗?这真的不是重定向。这就是我感到困惑的原因。
  • 一般来说,linux(和 Mac)命令行二进制文件会定期将结果发送到 stdout,并将错误消息发送到 stderr。例如,“ls /foo/bar”将列出路径 /foo/bar 到 stdout 如果它引用现有对象,并且如果它不存在将向 stderr 发送错误消息。如果您使用“shell=True”通过子进程模块的函数之一运行此命令,您将看到这些相同的结果分别映射到其 stdout 和 stderr 参数。 - 我知道其中没有任何奇怪的重定向行为。
  • 如果这只是iwconfig 的奇怪行为的问题,那么听起来@JohnAnderson 已经涵盖了你。
  • 我仍然不明白这个“将输出重定向到标准错误的标准 linux/unix 行为”是关于什么的。我在上面问过,希望有人能给我解释一下。如果有的话,我的经验恰恰相反……stderr 经常被重定向到 stdout。我们在谈论什么“重定向”? - 这与 Python 和 subprocess 模块有什么关系?

标签: python subprocess pipe stdout stderr


【解决方案1】:

正如@JohnAnderson 所说,发生这种情况是因为,如果我的系统上没有配置无线设备,iwconfig 的输出将被视为错误消息,即使输出似乎是正常的。 我还从subprocess 中找到了另一种新方法,称为 run() 并且发生了同样的情况,因此绝对是 Unix/Linux 行为。

s = subprocess.run('iwconfig', shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)

s.stderr #Produces output

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-03-13
    • 2011-02-28
    • 1970-01-01
    • 2021-11-09
    • 1970-01-01
    • 2019-06-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多