重定向子标准错误到标准输出(Redirect subprocess stderr to stdout

2019-06-26 07:27发布

我想重定向子到stdout的stderr输出。 恒STDOUT应该这样做,不应该吗?

然而,

$ python >/dev/null -c 'import subprocess;\
                        subprocess.call(["ls", "/404"],stderr=subprocess.STDOUT)'

输出的东西。 为什么会这样的情况,我怎么在标准输出上的错误信息?

Answer 1:

在的密切读取源代码给出了答案。 特别是,该文件是误导性的,当它说:

subprocess.STDOUT
特别值(...)表示标准误差应进入同一句柄作为标准输出。

由于标准输出被设定为“默认”( -1 ,技术上)当stderr=subprocess.STDOUT进行评价时,标准错误被设置为“默认”的可能。 不幸的是,这意味着标准错误输出还是到标准错误。

为了解决这个问题,通过在标准输出文件,而不是subprocess.STDOUT

$ python >/dev/null -c 'import subprocess,sys;subprocess.call(["ls", "/404"],
                        stderr=sys.stdout.buffer)'

或者,对于与Python的传统2.X版本的兼容性:

$ python >/dev/null -c 'import subprocess,sys;subprocess.call(["ls", "/404"],
                        stderr=sys.stdout.fileno())'


Answer 2:

其实用subprocess.STDOUT正是在文档中指出:它重定向标准错误到标准输出,使得例如

proc = subprocess.Popen(self.task["command"], shell=False, bufsize=1, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
output = ""
while (True):
    # Read line from stdout, break if EOF reached, append line to output
    line = proc.stdout.readline()
    line = line.decode()
    if (line == ""): break
    output += line

结果在可变output包含来自两个stdout和stderr输出的处理。

stderr=subprocess.STDOUT所有stderr输出直接重定向到调用过程,这是一个主要的差的标准输出。



文章来源: Redirect subprocess stderr to stdout