Python重定向标准输入

时间:2012-11-15 20:05:46

标签: python usb barcode stdin

我正在尝试设置条形码扫描仪对象,以捕获扫描仪本身输入的任何内容。条形码扫描器被识别为标准输入(stdin),因此每当我扫描条形码时,我都会得到标准输入文本。还会有一个连接到系统的键盘,这是另一个标准输入。为了区分条形码扫描输入和键盘输入,我将使用任何条形码信息的前缀。换句话说,如果我的条形码总长度为16个字符,则前4个将是预定的字符串/键,以指示后面的12个字符是条形码输入。这是我读过的标准。

现在我见过的大多数例子都会通过在GUI应用程序中捕获字符输入事件来识别条形码输入。然后,此事件回调方法构建一个缓冲区以检查4个字符的前缀,并根据需要重定向条形码输入。事件回调方法还将跳过任何与条形码无关的字符输入事件,并允许它们作为标准输入与GUI交互(键入文本框或有什么内容)。

除了不使用GUI应用程序之外,我想做同样的事情。我希望我的条形码扫描仪对象独立于GUI应用程序。理想情况下,我会在条形码扫描器对象中使用一个回调方法,即每次输入字符时stdin都会调用。从那里我将通过检查4个字符前缀来获取任何条形码输入,并且将传递任何不是条形码输入的字符。所以换句话说,我想让stdin通过我的条形码扫描器回调方法,然后我的条形码扫描器回调方法能够将非条形码字符作为标准输入管道输出,就好像什么都没发生一样(仍然是标准输入那将是一个文本框或其他东西)。

这是否可以在没有while循环的情况下持续监控stdin?即使我有一个while循环监视stdin,如果它们不是条形码输入,我如何将字符作为标准输出?我研究了使用pyusb接管条形码扫描器的USB接口,但这需要root权限才能与硬件交互(不是我项目的选项)。任何帮助将不胜感激。我还没有找到这方面的例子。

编辑:这个项目将在CentOS或某些Linux版本中运行。

1 个答案:

答案 0 :(得分:1)

在Unix中拦截标准输入的常规方法是管道和多个进程。如果您有一个多进程应用程序,那么一个进程可以接收“原始”标准输入,捕获条形码输入,并将其余部分传递给其标准输出。然后,该输出将是UI过程的标准输入,该过程仅接收非条形码数据。要在最初进行此设置,请使用单个启动过程来设置管道,启动其他两个过程并退出。

如果您对这些概念不熟悉,那么您前面有一个漫长而有趣的学习过程: - )

所有这些都假设您确实通过标准输入接收“键盘”数据,而不是通过您似乎暗示的X11事件。如果您在X11(或GTK等)中进行开发,那么我所描述的几乎肯定不会起作用。