2011-11-02 12 views
7

Mam dość długo działającą pracę, która działa przez kilka minut, a następnie zostaje ponownie uruchomiona. Zadanie generuje różne informacje, które przechwytuję w ten sposób:Jak mogę przechwytywać dane wyjściowe i wyświetlać je w tym samym czasie w Pythonie?

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

Chodzi o to, że otrzymam tylko całą produkcję na raz. Chciałbym wyświetlać dane wyjściowe, ponieważ program wysyła je na standardowe wyjście, a jednocześnie przesyła je z powrotem do bufora (muszę sprawdzić dane wyjściowe pod kątem obecności niektórych ciągów znaków). W Ruby chciałbym zrobić to tak:

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

Odpowiedz

5

Można spróbować czegoś takiego:

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 
3

Można ją przeczytać jeden wiersz naraz:

from subprocess import Popen, PIPE 

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

w ten sposób , blokujesz tylko czas potrzebny do przetworzenia, aby wyprowadzić pojedynczą linię.

+0

Ponieważ nie określono rozmiaru bufora, bufor o wielkości 4 KB zostanie dodany między dwoma procesami, więc zwykle nie będą się blokować. –

-1

Możesz użyć polecenia "tee". Robi dokładnie to, czego potrzebujesz.
http://www.computerhope.com/unix/utee.htm

+0

Tak, ale muszę przetworzyć bufor w Pythonie, aby wiedzieć, czy powinienem uruchomić zadanie ponownie. – Geo

+0

OP pyta o monitorowanie procesu, który uruchomili używając popenu z wewnętrznego kodu Pythona, więc nie jest to pomocne. – cowbert

Powiązane problemy