2009-06-08 17 views
16

मैं एक पाइप से लाइनें पढ़ने और उन्हें संसाधित करने की कोशिश कर रहा हूं, लेकिन मैं कुछ मूर्खतापूर्ण कर रहा हूं और मैं यह नहीं समझ सकता कि क्या। निर्माता लाइनों को अनिश्चित काल के उत्पादन रखने के लिए, इस तरह जा रहा है:पायथन - एक पाइप से सरल पठन लाइन

producer.py

import time 

while True: 
    print 'Data' 
    time.sleep(1) 

उपभोक्ता सिर्फ समय-समय पर लाइनों के लिए जाँच करने के लिए की जरूरत है:

consumer.py

import sys, time 
while True: 
    line = sys.stdin.readline() 
    if line: 
     print 'Got data:', line 
    else: 
     time.sleep(1) 

जब मैं इसे विंडोज़ खोल में python producer.py | python consumer.py के रूप में चलाता हूं, तो यह हमेशा के लिए सोता है (कभी डेटा नहीं लगता है?) ऐसा लगता है कि शायद समस्या यह है कि प्रोड ucer कभी समाप्त नहीं होता है, क्योंकि यदि मैं डेटा की सीमित मात्रा भेजता हूं तो यह ठीक काम करता है।

मैं डेटा प्राप्त करने और उपभोक्ता के लिए कैसे दिखा सकता हूं? असली एप्लिकेशन में, निर्माता एक सी ++ प्रोग्राम है जिसका मेरा कोई नियंत्रण नहीं है।

उत्तर

16

विंडोज़ के कुछ पुराने संस्करण फाइलों के माध्यम से पाइप सिमुलेट किए गए (इसलिए वे ऐसी समस्याओं से ग्रस्त थे), लेकिन यह 10+ वर्षों में कोई समस्या नहीं है। print के बाद एक

sys.stdout.flush() 
निर्माता को

जोड़ने का प्रयास करें, और यह भी निर्माता के stdout (python -u का उपयोग करके) unbuffered बनाने के लिए प्रयास करें।

बेशक यह आपकी मदद नहीं करता है अगर आपके पास निर्माता पर कोई नियंत्रण नहीं है - यदि यह अपने आउटपुट में बहुत अधिक बफर करता है तो भी आप लंबे समय तक इंतजार कर रहे हैं।

दुर्भाग्य से - जबकि वहाँ इस तरह के pyexpect, pexpect, exscript, और paramiko के रूप में यूनिक्स की तरह ऑपरेटिंग सिस्टम, पर इस समस्या का समाधान करने के लिए कई दृष्टिकोण हैं, मुझे शक है उनमें से किसी को विंडोज पर काम करता है; अगर यह वास्तव में मामला है, तो मैं Cygwin का प्रयास करूंगा, जो विंडोज़ पर लिनक्स जैसी लिनक्स को पर्याप्त रूप से रखता है क्योंकि अक्सर विंडोज बॉक्स पर लिनक्स जैसी दृष्टिकोणों के उपयोग को सक्षम बनाता है।

7

यह आई/ओ के बारे में है जो डिफ़ॉल्ट रूप से पायथन के साथ बफर किया गया है। दुभाषिया के लिए -u विकल्प दर्रा इस व्यवहार को निष्क्रिय करने के:

python -u producer.py | python consumer.py 

यह मेरे लिए समस्या का समाधान होता।

+0

क्या आपने प्रश्न की अंतिम वाक्य पढ़ी ?? – jwg

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