Python subprocess.Popen hangs in 'for l in p.stdout' until p terminates, why? -


मेरे पास वह कोड है:

  #! / Usr / bin / python -u localport = 9876 आयात सिस्टम, फिर से, सबप्रोसेस आयात से ओएस * ट्यून = पॉपिन (["। / Newtunnel", "22", str (स्थानीयपोर्ट)], stdout = PIPE, stderr = STDOUT) प्रिंट "** सुरंग सुरंग तैयार हो जाओ ... "के लिए tun.stdout: sys.stdout.write (l) अगर re.search (" कनेक्शन के लिए प्रतीक्षा कर रहा है ", l): प्रिंट" ** एसएसएच के लिए तैयार! " तोड़  

"./newtunnel" बाहर नहीं निकलता, यह लगातार अधिक से अधिक डेटा को स्टडआउट पर आउटपुट करेगा। हालांकि, यह कोड किसी भी आउटपुट को नहीं देगा और सिर्फ ट्यून.स्टडीआउट में प्रतीक्षा करता रहता है।

जब मैं न्यूटनेल प्रक्रिया को बाहरी रूप से मारता हूं, तो यह सभी डेटा को ट्यून। तो ऐसा लगता है कि मैं tun.stdout से कोई डेटा प्राप्त नहीं कर सकता जबकि यह अभी भी चल रहा है।

ऐसा क्यों है? मैं सूचना कैसे प्राप्त कर सकता हूं?

ध्यान दें कि Popen के लिए डिफ़ॉल्ट बफ़्ज़ेस 0 (unbuffered) है मैं भी bufsize = 0 निर्दिष्ट कर सकता हूं लेकिन वह कुछ भी बदल नहीं सकता।

ठीक है, ऐसा लगता है कि पायथन में एक बग है:

अगर मैं लाइन की जगह

  को tun.stdout में बदलता हूं:  

द्वारा

<प्री> जबकि सच: l = tun.stdout.readline ()

तब यह ठीक तरह से काम करता है जिस तरह से मैं चाहता हूं।


Comments