将按键从Python插入Linux控制台

将按键从Python插入Linux控制台,python,linux,keyboard,console,dtmf,Python,Linux,Keyboard,Console,Dtmf,我最近面临一个相当奇怪的任务,其中一个结果是必须能够使用DTMF(也称为“Touch Tone”)音调来控制非X Linux计算机的终端。计算机有一个可以通过ALSA访问的调制解调器,因此还有sox“rec”程序,我正在通过该程序读取输入。该计算机在其他方面是完全隔离的,没有以太网或其他任何网络接口。我使用的Goertzel算法实现非常有效,eSpeak语音合成引擎也是唯一的输出源;这应该适用于任何按键式电话。它使用ASCII助记符为控制字符读回输入(输入为八进制数字,一次读回一个ASCII字节

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

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

这真的是唯一的方法吗(如果是的话,Python是否也可以?),还是有其他方法可以直接访问控制台的内容


编辑:由于运气不佳,我最近才发现SVN版本的PExpect已经成功了。但是,它没有任何方法可以实际运行其下的程序。我必须关注它的发展。

如果你想操纵控制台的内容,你可能需要使用
诅咒。有很好的记录。查看
window.getch()
window.getyx()

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

由于您使用的是Python,我建议您查看一下该模块

如果您熟悉Python中的二进制I/O,那么您当然可以在没有任何库的情况下进行同样的操作;只需查看
/usr/include/linux/uinput.h
头文件中涉及的结构(接口是完全稳定的),也许还有一些是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应用程序只是执行程序,则应该使其成为终端仿真器——例如,使用。你也可以不用任何额外的库,使用Python;然而,主要的工作是用ANSI转义序列模拟终端,这样应用程序就不会混淆,现有的终端模拟器也有这样的代码。

好的,但是我如何在其中运行shell(比如
破折号
)?更准确地说,我如何在不重新实现
readline
的情况下运行shell呢,如果
readline
是您使用的
sh
的全部,那么就有了readline。是的,那么,除了添加文本(有人可以删除文本吗?),我如何操作输入缓冲区?