Как объединить stdout и stderr, но уметь различать их? - PullRequest
1 голос
/ 30 сентября 2019

Я хотел бы создать читаемый отчет HTML о выполнении процесса. С этой целью я хотел бы отследить и stdout, и stderr, и вывести их с чередованием, но при этом различить - например, журнал покажет их обоих вместе в том порядке, в котором они были выданы, но с stdoutв черном и stderr в жирном красном.

Я легко вижу решение, которое будет отличать их: просто перенаправьте каждый на subprocess.PIPE. Конечно, тогда они не могут быть рекомбинированы по порядку. Их также легко объединять по порядку: просто перенаправьте stderr на subprocess.STDOUT. Однако тогда они будут неразличимы.

Таким образом, получить результаты, которые будут или различимы или , объединены в порядке, просто, но получить и то, и другое не так.

Как это сделать в Python?

1 Ответ

2 голосов
/ 30 сентября 2019

Вы можете использовать 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
...