将输出抛出到外部,尽管在python子流程中给出了stderr=PIPE

将输出抛出到外部,尽管在python子流程中给出了stderr=PIPE,python,pipe,subprocess,Python,Pipe,Subprocess,在上面的代码中,当我给str=[some_valid_command]时,将输出给元组。当我发出一个无效的命令时,我希望错误被带到管道中,但它仍然在控制台上抛出。。。。我不太清楚,我在哪里理解错了 谢谢….我不确定您是否看到stderr实际出现在控制台上,或者只是在运行Python失败时生成了一个名为“blah”的进程,该进程是在运行您提供的示例时生成的 该示例的输出将是Python引发的OSError:[Errno 2]没有这样的文件或目录,除非路径中有一个名为“blah”的可执行脚本,否则这

在上面的代码中,当我给str=[some_valid_command]时,将输出给元组。当我发出一个无效的命令时,我希望错误被带到管道中,但它仍然在控制台上抛出。。。。我不太清楚,我在哪里理解错了


谢谢….

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

该示例的输出将是Python引发的
OSError:[Errno 2]没有这样的文件或目录
,除非路径中有一个名为“blah”的可执行脚本,否则这是意料之中的

我做了一个简单的测试,并编写了一个bash脚本,如下所示:

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

    tuples = cpuinfo.communicate()
在授予该脚本可执行权限后,我重复了您的示例,但改为调用我的脚本(在本地目录中命名为fail.sh),如下所示:

这返回了预期的
('This is stdout\n','This is failure on stderr\n')

所以,也许你在这里真正看到的是,无论你试图调用什么程序(如果不是胡说八道的话),在你的路径上根本不存在

还有一个关于在Python中将
str
用作标签的说明:
str
是内置类型,不应用作变量或函数的名称,除非您特别希望“重载”内置函数。
string
也是如此,它是一个类

#!/bin/bash

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

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