2013-12-18 56 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)