मैंने हमेशा सोचा था कि पाइथन में फ़ाइल की तरह इसे फिर से चलाना एक लूप में readline
विधि को कॉल करने के बराबर होगा, लेकिन आज मुझे एक ऐसी स्थिति मिली जहां यह सच नहीं है। विशेष रूप से, मैं एक Popen
'घ प्रक्रिया p
है जहांफ़ाइल-जैसी और रीडलाइन को कॉल करने के बीच अंतर
list(itertools.takewhile(lambda x: x != "\n",
p.stdout))
रुक जाता है (इनपुट के लिए शायद क्योंकि p
प्रतीक्षा करता है, दोनों stdin
और stdout
मेरी अजगर की प्रक्रिया के लिए पाइप हैं) है, जबकि निम्न काम करता है:
list(itertools.takewhile(lambda x: x != "\n",
iter(p.stdout.readline, "")))
क्या कोई अंतर बता सकता है?
साइड नोट: 'fiter() 'के बजाय आप' iter (f.readline, none)', या यहां तक कि 'iter (f.readline," \ n ")' 'takewhile()' को प्रतिस्थापित करने के लिए उपयोग कर सकते हैं। –
जो समस्या आप देख रहे हैं वह बफरिंग से संबंधित है: 'file.__ iter __()' file.readline() 'की तुलना में किसी भी तरह से अधिक आक्रामक बफरिंग करता है - यही कारण है कि आप उन्हें मिश्रण नहीं कर सकते हैं। विवरणों का शोध करने के लिए बहुत आलसी है और इस समय इसे एक जवाब में बदल दें ... –
@ स्वेनमार्कक: आपका मतलब है 'इटर (एफ .readline, "")', लेकिन हाँ, धन्यवाद, मैं इसके बारे में भूल रहा हूं :) –