如何统一 stdout 和 stderr,又能区分它们?
How to unify stdout and stderr, yet be able to distinguish between them?
我想生成一个可读的 HTML 过程报告 运行。为此,我想同时跟踪 stdout
和 stderr
,并将它们交错输出,但要区分 - 例如,日志将根据它们的发出顺序显示它们,但是stdout
为黑色,stderr
为粗体红色。
我可以很容易地找到一种解决方案,让它们与众不同:只需将每个重定向到 subprocess.PIPE
。当然,那么它们不能按顺序重新组合。按顺序统一它们也很容易:只需将 stderr
重定向到 subprocess.STDOUT
。不过,那样的话,他们就分不清了。
因此,将输出 或者 区分为 或 按顺序组合很简单,但同时获得两者则不然。
在 Python 中有什么方法可以做到这一点?
您可以使用select()
来复用输出。假设您在管道中捕获了 stdout 和 stderr,此代码将起作用:
import select
import sys
inputs = set([pipe_stdout, pipe_stderr])
while inputs:
readable, _, _ = select.select(inputs, [], [])
for x in readable:
line = x.readline()
if len(line) == 0:
inputs.discard(x)
if x == pipe_stdout
print 'STDOUT', line
if x == pipe_stderr
print 'STDERR', line
我想生成一个可读的 HTML 过程报告 运行。为此,我想同时跟踪 stdout
和 stderr
,并将它们交错输出,但要区分 - 例如,日志将根据它们的发出顺序显示它们,但是stdout
为黑色,stderr
为粗体红色。
我可以很容易地找到一种解决方案,让它们与众不同:只需将每个重定向到 subprocess.PIPE
。当然,那么它们不能按顺序重新组合。按顺序统一它们也很容易:只需将 stderr
重定向到 subprocess.STDOUT
。不过,那样的话,他们就分不清了。
因此,将输出 或者 区分为 或 按顺序组合很简单,但同时获得两者则不然。
在 Python 中有什么方法可以做到这一点?
您可以使用select()
来复用输出。假设您在管道中捕获了 stdout 和 stderr,此代码将起作用:
import select
import sys
inputs = set([pipe_stdout, pipe_stderr])
while inputs:
readable, _, _ = select.select(inputs, [], [])
for x in readable:
line = x.readline()
if len(line) == 0:
inputs.discard(x)
if x == pipe_stdout
print 'STDOUT', line
if x == pipe_stderr
print 'STDERR', line