#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, так что это бесполезно.