简单的python程序,在无头系统上的keypress上执行命令
inputexec的Python项目详细描述
此程序旨在处理无头主机的按钮/命令绑定。 它从输入设备(键盘、鼠标等)捕获所有事件并适当地运行命令。
inputexec诞生于需要将按键从遥控器传递给音乐播放器守护进程。
示例用法:
inputexec --action-commands=actions.ini --source-file=/dev/input/keyboard
--action-commands文件包含要映射到每个按键的操作:
[commands]keypress.KEY_PLAYPAUSE=mpc togglekeypress.KEY_PREVIOUSSONG=mpc prevkeypress.KEY_NEXTSONG=mpc nextkeypress.KEY_STOPCD=mpc stop
安装
inputexec是根据2条款bsd许可证分发的,需要python 2.6-3.3
分发包(推荐)
使用特定于分发的包(如果有)。 作者知道以下选项:
- 还没有
从pypi,python包索引
只需运行:
pip install inputexec
来源
您需要从pypi(https://pypi.python.org/pypi/evdev)获得的python-evdev库。
然后,运行:
git clone https://github.com/rbarrois/evdev.git
启动和配置
inputexec只使用可选参数;完整列表可通过inputexec --help获得。
也可以从作为inputexec --config /path/to/example.ini传递的配置文件中读取所有选项。 配置文件的有效选项列表可通过inputexec --dump-config获得。
配置操作
找到与每个按键相关的符号可能很复杂;要解决这个问题, inputexec可以在print模式下运行:
inputexec --source-file=/dev/input/event0 --action-mode=print
现在,每个按键都将显示在标准输出上:
keypress.KEY_PLAYPAUSEkeypress.KEY_PREVIOUSSONGkeypress.KEY_NEXTSONGkeypress.KEY_STOPCD
执行操作
提供三种操作模式,通过--action-mode:
- print:如上所述,只需将事件行打印到stdout
- run_sync:每当发生事件时,都会调用相关的命令; 这会阻塞程序
- run_async:启动一个或多个线程(该数字由 --action-jobs)和要运行的命令在这些线程之间调度。
输入
inputexec可以从stdin、文件或字符设备读取。
对于stdin,只需传递--source-file=-
如果提供了另一个文件路径,inputexec将查看其类型, 如果文件是主13的设备节点(即Linux上的输入设备), 使用evdev读取器。 Linux输入设备可以在shared模式下打开 (事件将传播到所有其他读取器)或以exclusive模式传播; 此行为由--source-mode=exclusive|shared标志控制。
否则,将从文件行生成事件。
记录和调试
inputexec提供了一些日志记录选项,由--logging-target标志控制:
- 系统日志
- 使用--logging-target=syslog,所有消息都将发送到syslog
- 标准差
- 使用--logging-target=stderr,数据将写入stderr
- 文件
- 使用--logging-target=file--logging-file=FILE,日志将附加到文件中
日志记录的详细程度可以通过--logging-level=进行调整。 --traceback选项允许在出现异常时转储完整(python)堆栈。
作为非根守护进程运行
默认情况下,/dev/input中的输入设备只能由root:root访问。
建议用户为inputexec设置一个专用的用户/组,并提供 向该用户读/写目标设备。
访问设备通常是一个udev配置任务。
首先,找到设备的id;查看/dev/input/by-id和/dev/input/by-path, 提供比/dev/input/event3更稳定的名称。
找到设备后(您还可以查看lsusb,插入/拔出时的内核日志等) 你需要一些规则让udev找到它:
$ udevadm info --attribute-walk --name=/dev/input/by-id/usb-13ec_0006-event-kbd
你会得到很多行,集中在前2-3个块上,并尝试寻找属性 特定于您的设备;对我来说,这是:
SUBSYSTEMS=="input" ATTRS{idVendor}=="13ec" ATTRS{idProduct}=="0006"
现在可以将udev规则写入/etc/udev/rules.d/80_setup_inputexec.rules:
# Include the matching attributes first (with ==), then force mode and group. SUBSYSTEM=="input", ATTRS{idVendor}=="13ec", ATTRS{idProduct}=="0006", MODE="660", GROUP="rcinput"
现在,拔下/重新插入设备并检查目标^{tt30上的权限}$ 符合你的期望。
贡献,报告问题
如果您发现问题或有改进建议,请随时与我联系:
- 在GitHub上打开问题
- 在raphael.barrois+inputexec@polytechnique.org 向我发送电子邮件
- 在irc上ping我,我是irc.freenode.net上的xelnor
待办事项
本节列出了要实现的功能、改进和其他想法。
- 端口到BSD内核
- 添加详尽的单元测试
- 编写手册页和init.d服务定义