2013-12-18 15 views
5

私はQRリーダー(システムによってキーボードと見なされます)からの入力を解析する小さなPythonスクリプトを書いています。Pythonはコンソール入力を継続的に解析します

現時点ではraw_input()を使用していますが、受信した文字列をプログラムに送信するために、この関数はEOF /行末記号を待ちます。 行末で制限されたチャンクだけでなく、入力文字列を継続的に解析する方法があるのだろうかと思います。

実際には: - コンソール入力を非同期かつ継続的に解析するPythonの方法はありますか? - raw_input()(または同等の機能)を変更して、プログラムに読み込まれた文字列を送信するために別の文字を探す方法はありますか?

+0

あなたは[ 'curses.window.getch'](http://docs.python.org/3/library/curses.html#を試してみてくださいcurses.window.getch)をno-delayモードで使用します。 –

+1

このデバイスでIOを処理する責任は何ですか?私はあなたがサブプロセスでそのコンポーネントを実行する必要があると思う。 – wim

+0

QRリーダードライバソフトウェアは、個々の文字を取得するためのAPI関数を持っていますか?キーボードの文字を読むために、Windows上の 'msvcrt.getch()'のように、入力ソースから単一の文字を読み込むOS依存の方法もあります。 – martineau

答えて

1

それはあなたが一般的に二つの問題解決しようとしているように思える:

  • は、最初の部分についてはその入力非同期
  • を解析

    1. はチャンクで入力を読むを、それが大幅に異なります入力関数の詳細については、あなたの呼び出し関数を参照してください。標準入力の場合は、次のようなものを使用できます。

      sys.stdin.read(1) 
      

      非同期で解析する場合、いくつかのアプローチがあります。 Pythonは同期型であるため、必然的にいくつかのサブプロセス呼び出しが必要になります。 the subprocess libraryを使用して手動で関数を生成することも1つの選択肢です。また、Redisや軽量のジョブキューのようなものを使って入力チャンクをポップし、別のバックグラウンドスクリプトで読み込んで処理させることもできます。最後に、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) 
      
    関連する問題