尽管在python子进程中给出了stderr = PIPE,但是输出在外面

时间:2012-06-12 16:42:03

标签: python pipe subprocess

    str = "blah -l"
    cpuinfo = subprocess.Popen(str.split(),stdout=PIPE,stderr=PIPE)

    tuples = cpuinfo.communicate()

在上面的代码中,当我给str = [some_valid_command]给出元组的输出。当我给出一个无效的命令时,我希望错误被带到PIPE,但它仍然在控制台上丢失......我不太确定,在哪里我理解错了......

感谢.....

1 个答案:

答案 0 :(得分:1)

我不确定你是否看到stderr实际出现在控制台上,或者只是遇到Python失败而产生一个名为“blah”的进程,这是在运行你提供的示例时生成的...

示例的输出将是Python引发OSError: [Errno 2] No such file or directory,除非在PATH中有一个名为“blah”的可执行脚本,否则这是预期的

我做了一个简单的测试,并写了一个像这样的bash脚本:

#!/bin/bash

echo "This is stdout"
echo "This is a failure on stderr" >&2
exit 1

在给予该脚本可执行权限后,我重复了您的示例,而是调用了我的脚本(在本地目录中名为fail.sh):

import subprocess

cmd = './fail.sh'
proc = subprocess.Popen(cmd.split(), stdout=subprocess.PIPE, stderr=subprocess.PIPE)
proc.communicate()

按预期返回('This is stdout\n', 'This is a failure on stderr\n')

所以也许你真正看到的是,无论你打算打电话给哪个节目(如果不是等等),你的PATH就不存在了。

另外注意在Python中使用str作为标签:str是内置类型,不应该用作变量或函数的名称,除非您特别想要“过载“内置功能。同样适用于string,这是一个类。