我有代码
proc = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
stdout, stderr = proc.communicate()
我尝试了分配给cmd的无效命令,但stderr始终为Null
像'ls fds'这样的无效命令会返回'ls:无法访问fds:没有这样的文件或目录' 但是这条消息既没有出现在stdout也没有出现在stderr中。
答案 0 :(得分:0)
听起来你可能会混淆stderr和进程的返回代码(在你调用proc.returncode
后proc.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'
>>>