2012-03-12 9 views
6

मैं subprocess मॉड्यूल का उपयोग कर पाइथन के साथ कमांड लाइन चैट बॉट के साथ संवाद करने की कोशिश कर रहा हूं। (Http://howie.sourceforge.net/ संकलित Win32 द्विआधारी का उपयोग कर, मैं अपने कारणों से है!)पायथन सबप्रोसेस इंटरैक्शन, मेरी प्रक्रिया Popen.communicate के साथ क्यों काम करती है, लेकिन Popen.stdout.read() नहीं?

यह काम करता है: प्रक्रिया के लिए

proc = Popen('Howie/howie.exe', stdout=PIPE,stderr=STDOUT,stdin=PIPE) 
output = proc.communicate() 

लेकिन Popen.communicate इंतजार समाप्त करने के लिए (और यह भेजता EOF ?), मैं इसके साथ बातचीत करने में सक्षम होना चाहता हूं। इस के लिए स्पष्ट समाधान/stdout पढ़ने, लिखने के लिए गया था stdin तो जैसे:

यह काम नहीं करता:

proc = Popen('Howie/howie.exe', stdout=PIPE,stderr=STDOUT,stdin=PIPE) 
while True: print proc.stdout.readline() 

(ध्यान दें कि मैं वास्तव में पर http://code.activestate.com/recipes/440554/ आधारित और अधिक जटिल कोड का उपयोग कर रहा है, लेकिन मुद्दा है वही।)

समस्या यह है कि दूसरा दृष्टिकोण cmd से संचार करने के लिए पूरी तरह से काम करता है, लेकिन जब मैं चैटबॉट चलाता हूं, कुछ भी नहीं। तो मेरा सवाल है, Popen.communicate() का उपयोग करने के लिए आउटपुट कैप्चर करने में यह अलग कैसे है?

यानी मैं सामान्य रूप से कमांड लाइन का उपयोग करने के लिए दूसरे दृष्टिकोण का उपयोग कर सकता हूं, जब तक कि मैं चैटबॉट चलाता हूं, जिस बिंदु पर मैं आउटपुट प्राप्त करना बंद कर देता हूं। पहले दृष्टिकोण का उपयोग बॉट से आउटपुट की पहली कुछ पंक्तियों को सही ढंग से प्रदर्शित करता है, लेकिन मुझे इसके साथ बातचीत करने में असमर्थ छोड़ देता है।

उत्तर

9

दोनों के बीच एक बड़ा अंतर यह है कि संचार() डेटा भेजने के बाद stdin बंद करता है। मुझे आपके विशेष मामले के बारे में पता नहीं है, लेकिन कई मामलों में इसका मतलब है कि यदि कोई उपयोगकर्ता उपयोगकर्ता इनपुट के अंत की प्रतीक्षा कर रहा है, तो उसे संवाद मिलेगा() का उपयोग किया जाता है, और जब कोड ब्लॉक हो जाता है तो उसे कभी नहीं मिलेगा पढ़ें() या readline()।

पहले Popen.stdin.close() जोड़ने का प्रयास करें और देखें कि यह आपके मामले को प्रभावित करता है या नहीं।

+0

क्यों धन्यवाद, स्टडिन ने चैटबॉट को 'Popen.communicate' के रूप में ठीक से शुरू करने की अनुमति दी, हालांकि अब मुझे यह मुद्दा है कि मुझे इससे बात करने में सक्षम होना चाहिए ... – SudoNhim

+0

शायद आपका एप्लिकेशन लाइन पढ़ रहा है -बाय-लाइन, किस मामले में आप इसे वापस जवाब देने के लिए केवल एक पंक्ति भेज सकते हैं? आप जिस सटीक कार्य को प्राप्त करने का प्रयास कर रहे हैं वह क्या है? – vmalloc

+0

लेकिन स्टडीन बंद होने के बाद मैं इसे इनपुट कैसे भेज सकता हूं? मैं लाइन-बाय-लाइन – SudoNhim

3

यदि आप Popen.stdin.close() का उपयोग करने के बजाय ईओएफ भेजने के बाद प्रोग्राम के साथ बातचीत करना चाहते हैं, तो आप मैन्युअल रूप से कमांड लाइन फ़ाइल फ़ाइल का अंत भेज सकते हैं, जिसका एक ही प्रभाव है लेकिन stdin खुला रहता है।

पायथन में इस चरित्र का भागने अनुक्रम '\x1a' है।

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^