【问题标题】:can't get stderr value from a subprocess无法从子进程中获取 stderr 值
【发布时间】:2013-06-07 21:41:32
【问题描述】:

我有代码

proc = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE) stdout, stderr = proc.communicate()

我尝试了分配给 cmd 的无效命令,但 stderr 始终为 Null

像“ls fds”这样的无效命令返回“ls: cannot access fds: No such file or directory” 但是该消息既没有出现在 stdout 也没有出现在 stderr 中。

【问题讨论】:

  • 你的shell抛出了那个错误信息。

标签: python subprocess pipe


【解决方案1】:

对我来说很好用:

$ python
Python 2.5.1 (r251:54863, May  5 2011, 18:37:34) 
[GCC 4.0.1 (Apple Inc. build 5465)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import subprocess
>>> cmd = ['ls', 'fds']
>>> proc = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE) 
>>> stdout, stderr = proc.communicate()
>>> stdout
''
>>> stderr
'ls: fds: No such file or directory\n'
>>> 

【讨论】:

    【解决方案2】:

    听起来您可能混淆了 stderr 和进程的返回码(在您调用 proc.communicate() 后可在 proc.returncode 中找到)。 stderr 是进程可用的第二个输出流。它通常用于打印不应与进程的正常(“标准”)输出混合的错误消息,但没有规则说它必须用于该目的,或者确实必须使用它。如果您将无效命令传递给Popen()cmd 参数,则将永远不会使用stderr,因为实际上没有命令运行。如果您尝试从进程中获取错误代码(数值),那么proc.returncode 就是您想要的。

    【讨论】:

      猜你喜欢
      • 2013-08-26
      • 1970-01-01
      • 2012-03-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-07
      • 2020-04-29
      相关资源
      最近更新 更多