Я пытаюсь прочитать как stdout
, так и stderr
из Popen
и распечатать их. Команда, которую я запускаю с Попеном, следующая
#!/bin/bash
i=10
while (( i > 0 )); do
sleep 1s
echo heyo-$i
i="$((i-1))"
done
echo 'to error' >&2
Когда я запускаю это в оболочке, я получаю одну строку вывода, затем второй разрыв, а затем еще одну строку и т. Д. Однако я не могу воссоздать это, используя python. Я запускаю два потока, по одному для чтения из stdout
и stderr
, помещаю прочитанные строки в Queue
и другой поток, который берет элементы из этой очереди и выводит их на печать. Но с этим я вижу, что все выходные данные распечатываются сразу после завершения подпроцесса. Я хочу, чтобы строки печатались как и когда они echo
'ed.
Вот мой код Python:
# The `randoms` is in the $PATH
proc = sp.Popen(['randoms'], stdout=sp.PIPE, stderr=sp.PIPE, bufsize=0)
q = Queue()
def stream_watcher(stream, name=None):
"""Take lines from the stream and put them in the q"""
for line in stream:
q.put((name, line))
if not stream.closed:
stream.close()
Thread(target=stream_watcher, args=(proc.stdout, 'out')).start()
Thread(target=stream_watcher, args=(proc.stderr, 'err')).start()
def displayer():
"""Take lines from the q and add them to the display"""
while True:
try:
name, line = q.get(True, 1)
except Empty:
if proc.poll() is not None:
break
else:
# Print line with the trailing newline character
print(name.upper(), '->', line[:-1])
q.task_done()
print('-*- FINISHED -*-')
Thread(target=displayer).start()
Есть идеи? Что мне здесь не хватает?