【问题标题】:Using STDIN in a Linux init script在 Linux 初始化脚本中使用 STDIN
【发布时间】:2011-08-24 19:32:40
【问题描述】:

我目前正在开发一个需要读取键盘输入的嵌入式系统(实际上 - 它需要读取键盘模拟的条形码扫描仪)。

我正在使用带有 Debian Squeeze 的 SheevaPlug 作为硬件部分,并且我正在使用一个非常基本的初始化脚本来触发一个负责执行业务逻辑的 python 程序。

正是那个脚本需要读取键盘输入。

我们开发的开发版本基本上是功能齐全的计算机,带有屏幕和其他东西,它运行得相当不错 - 但它不是真的可以接受 - 但在这里我真的不明白哪里出了问题(虽然我承认我有点期待它)。


所以我想知道如何在 init 启动时以某种方式将键盘连接到脚本的 STDIN。

或者,如果有人知道可以让我完全绕过问题并直接从 input/eventX 读取的 python 库,我会很感兴趣。



提前致谢

【问题讨论】:

  • 一个初始化脚本?您想在系统启动时读取条形码吗?你的意思是一个shell脚本?
  • 我在运行级别 2 上启动脚本(最后,所以 sshd 和其他东西优先启动)。如果这不是处理此问题的正确方法,我会对建议非常感兴趣!
  • 好的。只是想知道术语。那些“init”脚本只是恰好被 init 调用的 shell 脚本。从键盘读取应该不是问题,因为 init 的默认标准输入是系统控制台。但是,您需要一些方法来触发条码扫描仪进行实际扫描。这些 init/rc 脚本通常也不会通过简单的登录来执行。通常在启动时或更改运行级别时。
  • 好吧,现在,出于测试目的,我使用的是标准键盘(因为我的条形码扫描仪被识别为 HID 设备),它们的工作方式相同。但我的问题是,我的键盘似乎没有连接到系统控制台。但是,SheevaPlug 的 JTAG 端口是。
  • 您可以只从键盘显示的任何 /dev 文件中读取脚本,而不是默认为标准输入。那会让你进行调试。如果您正在登录,无论您的登录会话的伪终端是什么,它都可能是 /dev/pty/xxx。

标签: python linux stdin init


【解决方案1】:

试试这个(但要小心 /dev/input/event0 可以更改以代替重新插入多个 USB HID 设备):

import struct

inputDevice = "/dev/input/event0" #keyboard on my system
inputEventFormat = 'iihhi'
inputEventSize = 16

file = open(inputDevice, "rb") # standard binary file input
event = file.read(inputEventSize)
while event:
  (time1, time2, type, code, value) = struct.unpack(inputEventFormat, event)
  print type,code,value
  event = file.read(inputEventSize)
file.close()


        def getUSBHIDs(self):
    s=getExecOutput('cat /proc/bus/input/devices')
    events=[]
    for i in range(len(s)):
        m=re.search('^.*Handlers=kbd.*event(?P<name>[0-9]+).*$',s[i])
        if m:
            events+=['/dev/event'+m.group('name')]
    return events

【讨论】:

  • 你知道知道键盘/条形码阅读器连接到什么事件的便捷方法吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-02-14
  • 1970-01-01
  • 2011-06-05
  • 2011-10-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-18
相关资源
最近更新 更多