我想将子进程的标准错误输出重定向到标准输出。常量STDOUT
应该这样做,不是吗?
然而,
$ python >/dev/null -c 'import subprocess;\
subprocess.call(["ls", "/404"],stderr=subprocess.STDOUT)'
确实输出了一些东西。为什么会这样,我如何在标准输出上获得错误消息?
我想将子进程的标准错误输出重定向到标准输出。常量STDOUT
应该这样做,不是吗?
然而,
$ python >/dev/null -c 'import subprocess;\
subprocess.call(["ls", "/404"],stderr=subprocess.STDOUT)'
确实输出了一些东西。为什么会这样,我如何在标准输出上获得错误消息?
subprocess.STDOUT
(...) 的特殊值表示标准错误应该进入与标准输出相同的句柄。
由于在评估时 stdout 设置为“默认”(-1
从技术上讲)stderr=subprocess.STDOUT
,因此 stderr 也设置为“默认”。不幸的是,这意味着 stderr 输出仍会进入 stderr。
要解决此问题,请传入 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())'
实际上, usingsubprocess.STDOUT
完全符合文档中的说明:它将 stderr 重定向到 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 输出直接重定向到调用进程的 stdout,这是一个主要区别。