2011-04-29 20 views
7

Recientemente me he enfrentado a una tarea bastante extraña, un resultado es la necesidad de usar tonos DTMF (también llamados tonos táctiles) para controlar un terminal de computadora que no sea X Linux. . La computadora tiene un módem al que se puede acceder a través de ALSA, y por lo tanto el programa sox "rec", que es a lo que estoy leyendo la entrada. La computadora en cuestión está completamente aislada, sin Ethernet ni otras interfaces de red. La implementación del algoritmo de Goertzel que estoy usando funciona muy bien, al igual que el motor de síntesis de voz eSpeak, que es la única fuente de salida; se supone que esto funciona con cualquier teléfono Touch Tone. Lee de nuevo tanto las entradas (las entradas son dígitos octales, un byte ASCII a la vez) como lo que sea que el shell dash retroalimenta: el aviso, la salida de los comandos, etc., usando mnemónicos ASCII para los caracteres de control.Insertar pulsaciones de teclas en la consola Linux desde Python

El método actual que estoy utilizando para interactuar con dash y los programas iniciados a través de él es el módulo pexpect. Sin embargo, necesito que pueda, a petición, leer todo el contenido de la línea en la que se coloca el cursor, y no recuerdo pexpect pudiendo hacer esto (si es así, no puedo decirlo). La única otra solución en la que puedo pensar es usar de alguna manera Python para controlar, o actuar como, el teclado y los controladores de la consola.

¿Es esta, de hecho, la única manera de hacerlo (y si es así, incluso es posible con Python?), ¿O hay otra forma de tener acceso directo a los contenidos de la consola?

Edit: A través de la suerte, recientemente descubrí que la versión SVN de PExpect tiene pexpect.screen. Sin embargo, no tiene ninguna forma de ejecutar un programa debajo de él. Tendré que vigilar su desarrollo.

Respuesta

2

La solución simple es utilizar la interfaz de entrada del kernel de Linux. Le permite insertar pulsaciones de teclas y eventos de mouse en el kernel, exactamente como si provinieran de un dispositivo físico de interfaz humana. Esto básicamente convertiría su aplicación en un teclado/mouse.

Dado que está trabajando con Python, le recomiendo que eche un vistazo al módulo python-uinput.

Si te sientes cómodo con la E/S binaria en Python, entonces puedes hacer lo mismo sin bibliotecas; solo echa un vistazo al archivo de encabezado /usr/include/linux/uinput.h para las estructuras involucradas (la interfaz es completamente estable), y tal vez un poco de uinput tutorials en C también.

Tenga en cuenta que para acceder al dispositivo /dev/uinput o (dependiendo de su distribución) normalmente se requieren privilegios de administrador. Dirijo personalmente el servicio Python como usuario y grupo dedicado al servicio y modifico/agrego una regla udev (verifique todos los archivos bajo rules.d) para permitir el acceso de lectura y escritura al dispositivo uinput a ese grupo, algo así como

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

Sin embargo, si su aplicación Python simplemente ejecuta programas, debe convertirlo en un emulador de terminal, por ejemplo, usando this. También puede hacerlo sin bibliotecas adicionales, utilizando Python pty; Sin embargo, el trabajo principal es simular un terminal con secuencias de escape ANSI, para que las aplicaciones no se confundan y los emuladores de terminal existentes tengan dicho código.

0

Si desea manipular el contenido de la consola, probablemente desee utilizar curses. Está bien documentado here. Mira window.getch() y window.getyx().

+0

Ok, pero ¿cómo puedo ejecutar un shell (como 'dash') dentro de él? – mmirate

+0

Más precisamente, ¿cómo lo hago sin volver a implementar 'readline'? – mmirate

+0

Bueno, si 'readline' es todo lo que está usando' sh', entonces hay [enlaces de python] (http://docs.python.org/library/readline.html) para readline. – Anish

Cuestiones relacionadas