2013-12-18 58 views
5

我正在寫一個小的Python腳本,用於解析來自QR閱讀器(它被系統視爲鍵盤)的輸入。Python不斷解析控制檯輸入

此刻我正在使用raw_input(),但此函數等待EOF /行尾符號以將接收到的字符串提交給程序。 我想知道是否有一種方法來連續解析輸入字符串,而不僅僅是由行尾限制的塊。

實踐中: - 是否有一種方法在python異步和不斷地解析控制檯輸入? - 有沒有辦法將raw_input()(或等價的函數)改爲查找另一個字符,以便將讀入的字符串提交到程序中?

+0

您可以試試['curses.window.getch'](http://docs.python.org/3/library/curses.html# curses.window.getch)在無延遲模式。 –

+1

負責使用此設備處理IO的是什麼?我認爲您需要在子流程中運行該組件 – wim

+0

QR閱讀器驅動程序軟件是否具有用於檢索單個字符的API函數?也可能有一種操作系統依賴的方式來讀取輸入源中的單個字符,如Windows上的'msvcrt.getch()'以讀取鍵盤字符。 – martineau

回答

1

好像你通常試圖解決兩個問題:

  1. 閱讀塊輸入
  2. 解析異步輸入

在第一部分,將變化在很大程度上關於您撥打的輸入功能的具體細節,但對於標準輸入,您可以使用類似

sys.stdin.read(1) 

至於異步解析,可以採取多種方法。 Python是同步的,所以你必須涉及一些子進程調用。使用the subprocess library手動產生功能是一種選擇。你也可以使用類似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)