【问题标题】:Insert keypresses into the Linux console from Python从 Python 将按键插入 Linux 控制台
【发布时间】:2011-08-15 19:48:48
【问题描述】:

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

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

这确实是实现它的唯一方法(如果是这样,Python 甚至可以吗?),还是有其他直接访问控制台内容的方法?

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

【问题讨论】:

    标签: python linux keyboard console dtmf


    【解决方案1】:

    简单的解决方案是使用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 转义序列模拟终端,这样应用程序就不会混淆,并且现有的终端仿真器都有这样的代码。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 好的,但是如何在其中运行一个 shell(如 dash)?
      • 更准确地说,如何在不重新实现readline的情况下这样做?
      • 好吧,如果readline 是你使用sh 的全部,那么python bindings 就是readline。
      • 是的,那么,除了添加文本(有人要删除文本吗?),我该如何操作该输入缓冲区?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-11-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-21
      • 2010-11-18
      • 2020-05-24
      相关资源
      最近更新 更多