2015-05-26 5 views
7

से आउटपुट कैसे एकत्र करें मैं एक पायथन प्रक्रिया बनाने की कोशिश कर रहा हूं जो कुछ इनपुट पढ़ता है, इसे संसाधित करता है और परिणाम प्रिंट करता है। प्रसंस्करण एक उपप्रोसेसर (स्टैनफोर्ड के एनईआर) द्वारा किया जाता है, उदाहरण के लिए मैं 'बिल्ली' का उपयोग करूंगा। मुझे नहीं पता कि एनईआर कितना आउटपुट देगा, इसलिए मैं इसे सब इकट्ठा करने और इसे प्रिंट करने के लिए एक अलग थ्रेड चलाता हूं। निम्नलिखित उदाहरण दिखाता है।एक पायथन उपप्रोसेसर

import sys 
import threading 
import subprocess 

# start my subprocess 
cat = subprocess.Popen(
    ['cat'], 
    shell=False, stdout=subprocess.PIPE, stdin=subprocess.PIPE, 
    stderr=None) 


def subproc_cat(): 
    """ Reads the subprocess output and prints out """ 
    while True: 
     line = cat.stdout.readline() 
     if not line: 
      break 
     print("CAT PROC: %s" % line.decode('UTF-8')) 

# a daemon that runs the above function 
th = threading.Thread(target=subproc_cat) 
th.setDaemon(True) 
th.start() 

# the main thread reads from stdin and feeds the subprocess 
while True: 
    line = sys.stdin.readline() 
    print("MAIN PROC: %s" % line) 
    if not line: 
     break 
    cat.stdin.write(bytes(line.strip() + "\n", 'UTF-8')) 
    cat.stdin.flush() 

जब मैं कीबोर्ड के साथ टेक्स्ट दर्ज करता हूं तो यह अच्छी तरह से काम करता प्रतीत होता है। हालांकि, अगर मैं अपनी स्क्रिप्ट (बिल्ली file.txt | python3 my_script.py) में पाइप इनपुट करने का प्रयास करता हूं, तो एक रेसिंग स्थिति होती है। कभी-कभी मुझे उचित आउटपुट मिलता है, कभी-कभी नहीं, कभी-कभी यह बंद हो जाता है। किसी भी सहायता की सराहना की जाएगी!

मैं उबंटू 14.04, पायथन 3.4.0 चला रहा हूं। समाधान मंच-स्वतंत्र होना चाहिए।

+0

किसी ने मुझे एक बार कहा था कि एक अच्छा समाधान प्रदान किए बिना डबल पाइप समस्याग्रस्त है। –

उत्तर

2

अंत में th.join() जोड़े अन्यथा आप समय से पहले ही से पहले यह सब उत्पादन संसाधित धागा को मार सकता है जब मुख्य थ्रेड बाहर निकलता है: डेमॉन धागे मुख्य थ्रेड जीवित नहीं है (या th.setDaemon(True) बजाय th.join() निकालने के लिए)।

+0

दोह, इतना आसान, और मैंने इसे याद किया। धन्यवाद! : डी हालांकि मैं अन्य धागे को एक डिमन रखूंगा, लेकिन मुख्य लूप के बाद मैं मुख्य थ्रेड सो जाऊंगा, परिणाम को आउटपुट करने के लिए अन्य थ्रेड टाइम देने के लिए। –

+0

@ FlorijanStamenković time.sleep() यहां गलत बात है। यदि बच्चा प्रक्रिया फंस सकती है तो आप 'timeout' पैरामीटर को 'th.join()' से पास कर सकते हैं। – jfs

+0

जेएफ, आपकी टिप्पणी के लिए धन्यवाद। मुझे यकीन नहीं है कि मैं समझता हूं कि कैसे शामिल हों() मदद करेगा। यहां बताया गया है: –

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