我想重定向子到stdout的stderr输出。 恒STDOUT
应该这样做,不应该吗?
然而,
$ python >/dev/null -c 'import subprocess;\
subprocess.call(["ls", "/404"],stderr=subprocess.STDOUT)'
做输出的东西。 为什么会这样的情况,我怎么在标准输出上的错误信息?
我想重定向子到stdout的stderr输出。 恒STDOUT
应该这样做,不应该吗?
然而,
$ python >/dev/null -c 'import subprocess;\
subprocess.call(["ls", "/404"],stderr=subprocess.STDOUT)'
做输出的东西。 为什么会这样的情况,我怎么在标准输出上的错误信息?
在的密切读取源代码给出了答案。 特别是,该文件是误导性的,当它说:
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())'
其实用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输出直接重定向到调用过程,这是一个主要的差的标准输出。