如何统一 stdout 和 stderr,又能区分它们?

How to unify stdout and stderr, yet be able to distinguish between them?

我想生成一个可读的 HTML 过程报告 运行。为此,我想同时跟踪 stdoutstderr,并将它们交错输出,但要区分 - 例如,日志将根据它们的发出顺序显示它们,但是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