从Python将键盘插入Linux控制台

时间:2011-04-29 22:09:07

标签: python linux keyboard console dtmf

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

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

这确实是解决问题的唯一方法(如果是这样,甚至可以使用Python?),还是有另一种直接访问控制台内容的方法?

编辑:通过愚蠢的运气,我刚刚发现PExpect的SVN版本有pexpect.screen。但是,它没有任何实际运行程序的方法。我必须密切关注它的发展。

2 个答案:

答案 0 :(得分:3)

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

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

如果你对Python中的二进制I / O感到满意,那么你可以在没有任何库的情况下做同样的事情。只需查看所涉及结构的/usr/include/linux/uinput.h头文件(界面完全稳定),也可以查看C中的一些uinput tutorials

请注意,访问/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转义序列的终端,以便应用程序不会混淆,现有的终端仿真器具有这样的代码。

答案 1 :(得分:0)

如果要操纵控制台的内容,可能需要使用curses。这是有据可查的here。查看window.getch()window.getyx()