2013-12-18 8 views
5

मैं एक छोटी पायथन स्क्रिप्ट लिख रहा हूं जो एक क्यूआर रीडर से इनपुट को पार्स करता है (जिसे सिस्टम द्वारा कीबोर्ड के रूप में देखा जाता है)।पायथन निरंतर कंसोल इनपुट पार्स

फिलहाल मैं raw_input() का उपयोग कर रहा हूं लेकिन यह फ़ंक्शन प्रोग्राम में प्राप्त स्ट्रिंग सबमिट करने के लिए एक ईओएफ/एंड-ऑफ़-लाइन प्रतीक के लिए इंतजार कर रहा है। मैं सोच रहा हूं कि इनपुट स्ट्रिंग को लगातार पार्स करने का कोई तरीका नहीं है और न केवल लाइन अंत तक सीमित हिस्सों में।

अभ्यास में: - क्या पाइथन में असीमित रूप से एक तरीका है और लगातार एक कंसोल इनपुट पार्स है? - प्रोग्राम में स्ट्रिंग को सबमिट करने के लिए किसी अन्य चरित्र की तलाश करने के लिए raw_input() (या समकक्ष फ़ंक्शन) को बदलने का कोई तरीका है?

+0

आप कोशिश कर सकते हैं [ 'curses.window.getch'] (http://docs.python.org/3/library/curses.html# curses.window.getch) बिना देरी मोड में। –

+1

इस डिवाइस के साथ आईओ को संभालने के लिए ज़िम्मेदार क्या है? मुझे लगता है कि आपको उस घटक को उपप्रोसेसर – wim

+0

में चलाने की आवश्यकता है क्या क्यूआर रीडर ड्राइवर सॉफ़्टवेयर में अलग-अलग वर्णों को पुनर्प्राप्त करने के लिए एक एपीआई फ़ंक्शन है? इसके अलावा इनपुट स्रोतों से एकल वर्ण पढ़ने के लिए एक ओएस-निर्भर तरीका हो सकता है, जैसे कि कीबोर्ड वर्णों को पढ़ने के लिए विंडोज़ पर 'msvcrt.getch() '। – martineau

उत्तर

1

ऐसा लगता है कि आप आम तौर पर दो समस्याओं को हल करने की कोशिश कर रहे लगता है:

  1. मात्रा में इनपुट पढ़ें
  2. कि इनपुट एसिंक्रोनस रूप

पार्स पहले भाग के लिए, यह बहुत आधार पर भिन्न होगी आपके कॉलिंग इनपुट के विनिर्देशों पर, लेकिन मानक इनपुट के लिए आप

sys.stdin.read(1) 
जैसे कुछ का उपयोग कर सकते हैं

असीमित रूप से पार्सिंग के लिए, आप कई दृष्टिकोण ले सकते हैं। पायथन सिंक्रोनस है, इसलिए आपको जरूरी कुछ सबप्रोसेस कॉल शामिल करना होगा। the subprocess library का उपयोग कर एक फ़ंक्शन को मैन्युअल रूप से एक विकल्प बनाना एक विकल्प है। आप पॉप इनपुट हिस्सों पर रेडिस या कुछ हल्के नौकरी कतार जैसे कुछ भी इस्तेमाल कर सकते हैं और उन्हें एक और पृष्ठभूमि स्क्रिप्ट द्वारा पढ़ और संसाधित कर सकते हैं। अंत में, gevent एसिंक्रोनस प्रक्रियाओं को फैलाने के लिए एक बहुत लोकप्रिय कोरआउटिन आधारित लाइब्रेरी है। gevent का उपयोग करना, इस पूरे सेट अप कुछ इस तरह दिखेगा:

class QRLoader(object): 
    def __init__(self): 
     self.data = [] 

    def add_data(data): 
     self.data.append(data) 

     # if self._data constitutes a full QR code 
     # do something with data 
     gevent.spawn(parse_async) 

def parse_async(): 
    # do something with qr_loader.data 

qr_loader = QRLoader() 

while True: 
    data = sys.stdin.read(1) 
    if data: 
     qr_loader.add_data(data) 
संबंधित मुद्दे