python - 从 Python 将按键插入 Linux 控制台

标签 python linux keyboard console dtmf

我最近遇到了一项相当奇怪的任务,一个结果是必须能够使用 DTMF(又名“按键音”)音调来控制非 X Linux 计算机的终端。计算机有一个可以通过 ALSA 访问的调制解调器,因此有 sox“rec”程序,这就是我正在读取输入的内容。有问题的计算机在其他方面是完全隔离的,没有任何以太网或其他网络接口(interface)。我使用的 Goertzel 算法实现效果很好,eSpeak 语音合成引擎也是唯一的输出源;这应该适用于任何按键式电话。它读回输入(输入是八进制数字,一次一个 ASCII 字节)和 dash shell 反馈的任何内容——提示、命令的输出等,使用 ASCII 助记符进行控制字符。

我用于与 dash 交互的当前方法以及通过它启动的程序是 pexpect 模块。但是,我需要它能够根据需要读回光标所在行的全部内容,我不记得 pexpect 能够做到这一点(如果它是, 我不能说。)。我能想到的唯一其他解决方案是以某种方式使用 Python 来控制或充当键盘和控制台驱动程序。

这确实是解决此问题的唯一方法(如果是这样,使用 Python 是否可行?),还是有其他方法可以直接访问控制台的内容?

编辑: 运气不好,我最近才发现 PExpect 的 SVN 版本有 pexpect.screen .但是,它没有任何方法可以在其下实际运行程序。我将不得不关注它的发展。

最佳答案

简单的解决方案是使用 Linux 内核 uinput 接口(interface)。它允许您将按键和鼠标事件插入内核,就像它们来自物理人机界面设备一样。这基本上会将您的应用程序变成键盘/鼠标。

由于您使用的是 Python,我建议您看一下 python-uinput模块。

如果您熟悉 Python 中的二进制 I/O,那么您当然可以在没有任何库的情况下进行同样的操作;只需检查 /usr/include/linux/uinput.h 头文件中涉及的结构(接口(interface)完全稳定),也许还有一些 uinput tutorials在 C 中也是如此。

请注意,访问 /dev/uinput/dev/input/uinput 设备(取决于您的发行版)通常需要 root 权限。我会以专用于该服务的用户和组的身份亲自运行 Python 服务,并修改/添加一个 udev 规则(检查 rules.d 下的所有文件)以允许对 uinput 设备进行读写访问对那群人来说,像

SUBSYSTEM=="input", ENV{ID_INPUT}=="", IMPORT{builtin}="input_id"
KERNEL=="uinput", MODE="0660", GROUP="the-dedicated-group"

但是,如果您的 Python 应用程序只是执行程序,您应该将其设置为终端仿真器——例如,使用 this .您也可以在没有任何额外库的情况下使用 Python pty ;然而,主要工作是用 ANSI 转义序列模拟终端,这样应用程序就不会混淆,现有的终端仿真器都有这样的代码。

关于python - 从 Python 将按键插入 Linux 控制台,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5837906/

相关文章:

python - 有没有办法在 Pandas 中自定义清理一行?

Java邮件 : Read Email on Ubuntu

c# - 在输入编辑框之前如何拦截键盘输入?

c# - 如何检测C#表单中是否按下了多个键

python - Pandas 保留数字部分

python - 在 matplotlib 中为样本分配日期

linux - 使用 awk 提取文件的所需部分时出现混淆

python - 使用 python 在 Mac 上监视全局键盘输入

python - Django URLResolver错误

c - 我在C程序中遇到冲突类型错误