2013-01-21 22 views
6

asmak gibiPython popen(). Stdout.read() Python en <code>subprocess.Popen</code> kullanarak, başka komut çıktısını almaya çalışıyorum

process = Popen(command, stdout=PIPE, shell=True) 
exitcode = process.wait() 
output = process.stdout.read() # hangs here 

Ben koşmak sadece, üçüncü satırında asılı izler Bir python betiği olarak bunu python kabuğunda yeniden üretemiyorum.

Diğer komut dosyası yalnızca birkaç sözcük yazdırıyor ve bunun bir arabellek sorunu olmadığı varsayılıyor.

Burada yanlış yaptığım şey hakkında bir fikri olan var mı?

+0

Ve komut 'komut' el ile çalıştırırsanız, çıktı üretir? –

cevap

0

.wait() artı .read() yerine .communicate() kullanmak isteyebilirsiniz. stdout=PIPE ve/veya stderr=PIPE kullanırken

kilitlenmeye Bu Uyarı ve çocuk süreci bloke kabul etmek OS boru tampon bekleyen öyle ki bir boruya yeterli çıktı oluşturur: subprocess dokümanları sayfasındaki uyarıyı yaklaşık wait() Not daha fazla veri. Bunu önlemek için communicate() kullanın.

http://docs.python.org/2/library/subprocess.html#subprocess.Popen.wait

+0

Cevabınız için teşekkürler. Belgelerin o kısmını okuduğumu fark ettim .. Yaptığım şey stdout gerçek zamanını bir '' process.poll() 'a getirmekti. indirilmiş versiyonu. Ama sanırım benzer bir kilitlenme sorunu yüzünden asılıydı. – lyomi

0

okuma() dönmeden önce EOF bekler. Şunları yapabilirsiniz

: alt işlemi için

  • beklemeye ölmek, sonra okumak() döndürecektir.
  • Eğer çıktınız hatlara bölünmüşse (eğer herhangi bir çıkış çizgisi yoksa da yine de askıda kalacak) readline() kullanın.
  • os.read (F, N) öğesini F'nin en çok N baytında döndürür, ancak yine de boru boşsa engellenir (O_NONBLOCK, fd'ye ayarlanmadıkça).