SORU
10 Mayıs 2010, PAZARTESİ


okuma alt işlemi satır satır stdout

Benim python betiği alt işlemi çok gürültülü bir linux programı çağırmak için kullanır. Bir günlük dosyası çıktı hepsini saklamak istiyorum ve kullanıcıya göstermek. Aşağıdaki çalışacağını düşünmüştüm, ama çıkış yardımcı çıkış önemli miktarda üretti kadar uygulamam görünmüyor.

#fake_utility.py, just generates lots of output over time
import time
i = 0
while True:
   print hex(i)*512
   i  = 1
   time.sleep(0.5)

#filters output
import subprocess
proc = subprocess.Popen(['python','fake_utility.py'],stdout=subprocess.PIPE)
for line in proc.stdout:
   #the real code does filtering here
   print "test:", line.rstrip()

Asıl istediğim davranış filtre script alt işlemi alınan her satırı yazdırmak için. tee ama python kodu ile ne gibi sayılır.

Neyi kaçırıyorum? Bu mümkün olabilir mi?


Güncelleme:

Eğer sys.stdout.flush() fake_utility.py python 3.1 istenilen davranış kodu eklenir. Python 2.6 kullanıyorum. proc.stdout.xreadlines() kullanarak py3k, ama yok aynı işi yaptığını düşünebilirsiniz.


Güncelleme 2:

Burada en az çalışan kod.

#fake_utility.py, just generates lots of output over time
import sys, time
for i in range(10):
   print i
   sys.stdout.flush()
   time.sleep(0.5)

#display out put line by line
import subprocess
proc = subprocess.Popen(['python','fake_utility.py'],stdout=subprocess.PIPE)
#works in python 3.0 
#for line in proc.stdout:
for line in iter(proc.stdout.readline,''):
   print line.rstrip()

CEVAP
11 Mayıs 2010, Salı


Ben geçen Python ile çalışalı uzun zaman oldu ama sorun deyimiyle bence üzerinde yineleme önce tüm giriş okur for line in proc.stdout,. Çözüm readline() yerine kullanmak için:

#filters output
import subprocess
proc = subprocess.Popen(['python','fake_utility.py'],stdout=subprocess.PIPE)
while True:
  line = proc.stdout.readline()
  if line != '':
    #the real code does filtering here
    print "test:", line.rstrip()
  else:
    break

Hala alt işlemi ile uğraşmak zorunda dersin' tampon.

Not: according to the documentation Bu çözüm ile bir yineleyici olmalıdır eşdeğer kullanarak readline() dışında, önceden okuma arabelleği, ama (ya da tam olarak bu) önerilen değişiklik yaptı üretmek farklı sonuçlar için bana (Python 2.5 üzerinde Windows XP).

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • André Frizzo

    André Frizz

    16 Aralık 2006
  • PorterRobinsonVEVO

    PorterRobins

    11 Kasım 2013
  • tinycammonitor

    tinycammonit

    14 Aralık 2010