我最近遇到了一个相当奇怪的任务,一个结果是必须能够使用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。但是,它没有任何实际运行程序的方法。我必须密切关注它的发展。
答案 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()
。