2011-11-02 17 views
7

Birkaç dakika çalışıp sonra yeniden başlatılan oldukça uzun bir koşu işim var.Çıkışı nasıl yakalayabilirim ve Python ile aynı anda nasıl gösterebilirim?

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

şey, sadece bir anda tüm çıktısını alacak: Görev Böyle yakalamak çeşitli bilgiler verir. Çıktıyı programa stdout'a gönderirken göstermek istiyorum, yine de bir tamponda geri iterek (bazı dizilerin varlığı için çıkışı kontrol etmem gerekiyor). Ruby ben böyle yapmak olacaktır: Bu şekilde

from subprocess import Popen, PIPE 

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

:

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 

cevap

5

Böyle bir şey deneyebilirsiniz , sadece tek bir satır çıktısı almak için gereken süreyi engelliyorsunuz.

3

tek bir satır bir anda okuyabiliyordunuz:

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

Bir arabellek boyutu belirtmediğinizden, iki işlem arasında 4 KB'lık bir arabellek eklenir, böylece genellikle birbirlerini engellemezler. –

-1

"Tişört" komutunu kullanabilirsiniz. Tam olarak ihtiyacınız olan şeyi yapar.
http://www.computerhope.com/unix/utee.htm

+0

Evet, ancak görevi yeniden başlatmam gerekip gerekmediğini öğrenmek için arabayı Python'da işlemem gerekiyor. – Geo

+0

OP, Python kodunun içinden popen kullanarak başlattıkları bir işlemi izlemeyi istemektedir, bu yüzden bu yardımcı olmaz. – cowbert

İlgili konular