简单的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上的权限}$ 符合你的期望。

贡献,报告问题

如果您发现问题或有改进建议,请随时与我联系:

待办事项

本节列出了要实现的功能、改进和其他想法。

  • 端口到BSD内核
  • 添加详尽的单元测试
  • 编写手册页和init.d服务定义

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java我能在这个程序中更好地使用内存吗?   为什么我的Java while循环迭代了一半   java IntelliJ IDEA不在构建时复制资源   socket仅在Java TCP服务器输出上检查客户端断开连接   java游戏物理摩擦   java片段onClick调用方法   symja数学分析器中无法识别java Abs[x]   java在使用泛型时创建二进制搜索树类的实例?   java在外键约束表上的添加和删除   语法java表达式的含义,如果有条件   java创建内联对象并作为参数传递   是否有相当于Redis排序集(zset)的Java数据结构   java找不到适合的方法(无参数)   音频文件操作给定字节帧的音量Java   Eclipse4不以JavaWebStart启动   java如何使用org在JSON对象中获取嵌套的键元素。json?   java与Jackson的反序列化:“org.codehaus.Jackson.map.JsonMappingException:无法反序列化[projectname]的实例。”   字符串的Java正则表达式   spring集成上的java检测缺火指令