Как я могу захватывать выходные данные и показывать их одновременно с помощью Python?

#python

#python

Вопрос:

У меня довольно длительное задание, которое выполняется в течение нескольких минут, а затем перезапускается. Задача выводит различную информацию, которую я фиксирую следующим образом:

 output = subprocess.Popen(cmd,stdout=subprocess.PIPE).communicate()
  

Дело в том, что я получу только весь вывод за раз. Я хотел бы показывать выходные данные по мере того, как программа отправляет их в стандартный вывод, все еще помещая их обратно в буфер (мне нужно проверить выходные данные на наличие некоторых строк). В Ruby я бы сделал это так:

 IO.popen(cmd) do |io|
  io.each_line do |line|
    puts line
    buffer << line
  end
end
  

Ответ №1:

Вы можете попробовать что-то вроде этого :

 cmd = ["./my_program.sh"]
p = subprocess.Popen( cmd, shell=False, stdout=subprocess.PIPE)   # launch the process
while p.poll() is None:          # check if the process is still alive
    out = p.stdout.readline()    # if it is still alive, grab the output
    do_something_with(out)       # do what you want with it
  

Ответ №2:

Вы могли бы читать его по одной строке за раз:

 from subprocess import Popen, PIPE

p = Popen('grep -ir graph .', stdout=PIPE)
while not p.returncode:
    s = p.stdout.readline()
    print s
    p.poll()
  

Таким образом, вы блокируете только время, необходимое для обработки вывода одной строки.

Комментарии:

1. Поскольку вы не указали размер буфера, между двумя процессами будет добавлен буфер размером 4 КБ, поэтому они обычно не будут блокировать друг друга.

Ответ №3:

Вы можете использовать команду «tee». Он делает именно то, что вам нужно от него.
http://www.computerhope.com/unix/utee.htm

Комментарии:

1. Да, но мне нужно обработать буфер в Python, чтобы знать, следует ли мне снова запускать задачу.

2. OP запрашивает о мониторинге процесса, который они запустили с помощью popen изнутри кода Python, так что это бесполезно.