无法从子进程获取stderr值

时间:2013-06-11 21:38:58

标签: python subprocess pipe

我有代码

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

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

像'ls fds'这样的无效命令会返回'ls:无法访问fds:没有这样的文件或目录' 但是这条消息既没有出现在stdout也没有出现在stderr中。

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

对我来说很好:

$ 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'
>>>