2016-04-07 22 views
1

Bir alt işlem başlatan ve standart çıktısını izleyen basit bir python betiği yapmaya çalışıyorum. Burada kod snippet'idir:Python: Alt işlemin stdout'unu blokaj dışı bir şekilde nasıl okur?

process = subprocess.Popen([path_to_exe, os.path.join(temp_dir,temp_file)], stdout=subprocess.PIPE) 
while True: 
    output=process.stdout.readline() 
    print "test" 

sorun komut output=process.stdout.readline() ve alt işlemi bittikten sonra hat print "test" sadece çalıştırır asılı olmasıdır.

Standart çıktıyı okumanın ve alt işlemin sonlandırılmasını beklemek zorunda kalmadan yazdırmanın bir yolu var mı?

Başladığım alt işlem, kaynak kodun bulunmadığı Windows ikili sistemidir.

Birkaç benzer soru buldum, ancak cevaplar sadece Linux'ta ya da başlayabildiğim işlem kaynağının olması durumunda geçerlidir.

+0

Uygulamanıza ilişkin daha fazla ayrıntı sağlamanız gerektiğini düşünüyorum. İkili örnek çıktı nedir? Tek bir çizgi mi, çok mu? Bu tür bir arayüz için ikili gibi kötü bir ses gibi geliyor. Bu çıkış sadece ikili sonlandırmanın bir sonucu olarak temizlendi. – Dunes

+0

Aslında farklı ikili dosyaları (Acrobat reader ama aynı zamanda diğer) havlamaları ve çökmeleri algılamak istiyorum. Çıkış kodunu alabilirim, ancak standart çıktı/hataya sahip olmak isterim. – pineappleman

cevap

4

Kontrol select modül

import subprocess 
import select 
import time 

x=subprocess.Popen(['/bin/bash','-c',"while true; do sleep 5; echo yes; done"],stdout=subprocess.PIPE) 

y=select.poll() 
y.register(x.stdout,select.POLLIN) 

while True: 
    if y.poll(1): 
    print x.stdout.readline() 
    else: 
    print "nothing here" 
    time.sleep(1) 

DÜZENLEME: sigara posix sistemleri için

Dişli Çözüm:

import subprocess 
from threading import Thread 
import time 

linebuffer=[] 
x=subprocess.Popen(['/bin/bash','-c',"while true; do sleep 5; echo yes; done"],stdout=subprocess.PIPE) 

def reader(f,buffer): 
    while True: 
    line=f.readline() 
    if line: 
     buffer.append(line) 
    else: 
     break 

t=Thread(target=reader,args=(x.stdout,linebuffer)) 
t.daemon=True 
t.start() 

while True: 
    if linebuffer: 
    print linebuffer.pop() 
    else: 
    print "nothing here" 
    time.sleep(1) 
+0

"AttributeError: '' modül 'nesnesinin' yoklama 'özniteliği yok mesajını alıyorum. Modül Windows için farklı olabilir mi? – pineappleman

+1

Seçimler, pencerelerdeki akışlarla çalışamaz gibi görünüyor, [burada] (http://stackoverflow.com/a/22254123/1477064) thread sonraki en iyi seçenek olarak önerilmiştir – xvan

+1

@pineappleman Dişli sürümle düzenlenmiştir. – xvan

0

Bu deneyebilirsiniz:

import subprocess 
import os 

""" Continuously print command output """ 
""" Will only work if there are newline characters in the output. """ 

def run_cmd(command):  
    popen = subprocess.Popen(command, stdout=subprocess.PIPE) 
    return iter(popen.stdout.readline, b"") 

for line in run_cmd([path_to_exe, os.path.join(temp_dir,temp_file)]): 
    print(line), # the comma keeps python from adding an empty line 
İlgili konular