से सभी इनपुट सिग्नल नहीं करता है। मैं पाइथन के साथ बाहरी कमांड लाइन प्रोग्राम लोड करने और पाइप के माध्यम से इसके साथ संवाद करने की कोशिश कर रहा हूं। प्रोगाम stdin के माध्यम से टेक्स्ट इनपुट लेता है और stdout के लिए लाइनों में पाठ आउटपुट पैदा करता है। चयन() का उपयोग कर संचार अतुल्यकालिक होना चाहिए।पायथन: चयन() पाइप
समस्या यह है कि कार्यक्रम के सभी आउटपुट को चयन() में संकेतित नहीं किया जाता है। आमतौर पर अंतिम एक या दो लाइनों को संकेत नहीं दिया जाता है। यदि एक टाइमआउट के साथ चयन() रिटर्न (और मैं पाइप से पढ़ने की कोशिश कर रहा हूं वैसे भी readline() प्रोग्राम से भेजे गए लाइन के साथ तत्काल लौटाता है। नीचे कोड देखें।
प्रोग्राम आउटपुट को बफर नहीं करता है और टेक्स्ट आउटपुट में सभी आउटपुट भेजता है। कई अन्य भाषाओं और वातावरण में पाइप के माध्यम से कार्यक्रम से जुड़ने से अब तक ठीक काम किया है।
मै मैक ओएसएक्स 10.6 पर पायथन 3.1 और 3.2 की कोशिश की है।
import subprocess
import select
engine = subprocess.Popen("Engine", bufsize=0, stdin=subprocess.PIPE, stdout=subprocess.PIPE)
engine.stdin.write(b"go\n")
engine.stdin.flush()
while True:
inputready,outputready,exceptready = select.select([engine.stdout.fileno()] , [], [], 10.0)
if (inputready, outputready, exceptready) == ([], [], []):
print("trying to read from engine anyway...")
line = engine.stdout.readline()
print(line)
for s in inputready:
line = engine.stdout.readline()
print(line)
पूरी तरह से काम करता है, धन्यवाद! – StefanMK
खुशी मैं मदद कर सकता था! – samplebias