मेरी अजगर लिपि एक उपकथा का उपयोग करने के लिए उपप्रकार का उपयोग करती है जो बहुत शोर है। मैं सभी आउटपुट को एक लॉग फ़ाइल में संग्रहीत करना चाहता हूं और उपयोगकर्ता को कुछ दिखाता हूं। मैंने सोचा था कि निम्नलिखित काम करेगा, लेकिन जब तक उपयोगिता ने आउटपुट की एक महत्वपूर्ण मात्रा का उत्पादन नहीं किया है, तब तक आउटपुट मेरे आवेदन में दिखाई नहीं देता है।
#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()
मैं वास्तव में जो व्यवहार चाहता हूं वह फ़िल्टर स्क्रिप्ट के लिए प्रत्येक पंक्ति को प्रिंट करने के लिए है क्योंकि यह सबप्रोसेस से प्राप्त होता है। क्रमबद्ध जैसे कि क्या tee
करता है लेकिन अजगर कोड के साथ।
मैं क्या खो रहा हूँ? क्या यह भी संभव है?
अपडेट करें:
यदि a sys.stdout.flush()
को fake_utility.py में जोड़ा जाता है, तो कोड में अजगर 3.1 में वांछित व्यवहार है। मैं अजगर 2.6 का उपयोग कर रहा हूँ। आपको लगता है कि उपयोग proc.stdout.xreadlines()
py3k के समान ही काम करेगा, लेकिन ऐसा नहीं है।
अपडेट 2:
यहाँ न्यूनतम काम कोड है।
#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()
subprocess.communicate()
print line,
इसके बजाय उपयोग कर सकते हैंprint line.rstrip()
(नोट: अंत में अल्पविराम)।