phi*_*hag 37 python subprocess stderr
我想将子进程的stderr输出重定向到stdout.常数STDOUT应该这样做,不应该吗?
然而,
$ python >/dev/null -c 'import subprocess;\
subprocess.call(["ls", "/404"],stderr=subprocess.STDOUT)'
Run Code Online (Sandbox Code Playgroud)
做输出的东西.为什么会这样,我如何在stdout上收到错误消息?
phi*_*hag 35
仔细阅读源代码就可以得到答案.特别是,文档说它时会产生误导:
subprocess.STDOUT
特殊值(...)表示标准错误应与标准输出进入同一句柄.
由于stdout -1在stderr=subprocess.STDOUT评估时设置为"default"(技术上),因此stderr也设置为"default".不幸的是,这意味着stderr输出仍然转到stderr.
要解决此问题,请传入stdout文件而不是subprocess.STDOUT:
$ python >/dev/null -c 'import subprocess,sys;subprocess.call(["ls", "/404"],
stderr=sys.stdout.buffer)'
Run Code Online (Sandbox Code Playgroud)
或者,为了与遗留的2.x版本的Python兼容:
$ python >/dev/null -c 'import subprocess,sys;subprocess.call(["ls", "/404"],
stderr=sys.stdout.fileno())'
Run Code Online (Sandbox Code Playgroud)
Max*_*xim 16
其实用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
Run Code Online (Sandbox Code Playgroud)
导致变量output包含stdout和stderr的进程输出.
stderr=subprocess.STDOUT将所有stderr输出直接重定向到调用进程的stdout,这是一个主要区别.
| 归档时间: |
|
| 查看次数: |
37798 次 |
| 最近记录: |