Pregunta

Tengo un script que utiliza pexpect para iniciar un programa de CLI. Funciona un poco como una concha donde se obtiene un indicador de donde se puede introducir algunos comandos.

El problema que tengo, creo, es que este programa utiliza un indicador de color.

Esto es lo que hago

import pprint
import pexpect

1 a = pexpect.spawn('program')
2 a.expect("prompt>")
3 print "---------start------------"
4 print(a.before)
5 a.sendline("command")
6 a.expect("prompt>")
7 print "---------before------------"
8 pprint.pprint(a.before)
9 print "---------after------------"
10 pprint.pprint(a.after)

Esta es la salida:

> python borken.py
---------start------------
A lot of text here from the enjoying programs start-up, lorem ipsum ...  
---------before------------
' \x1b[0m\x1b[8D\x1b[K\x1b[1m\x1b[34m'
---------after------------
'prompt>'

Por alguna razón el primer código de colores pronta borkens las cosas y A.Before en la línea 8 es ininteligible, de impresión normal no funciona, incluso si veo que el comando en la línea 5 en realidad produce una gran cantidad de salida.

¿Alguien sabe cuál es el problema podría ser, o es posible establecer el tipo de terminal en pexpect para evitar los colores?

Estoy utilizando shell tcsh

¿Fue útil?

Solución

Bueno, he encontrado la respuesta. La respuesta de CSL me puso en el camino correcto.

pexpect tiene una opción de "env", que pensé que podía usar. de esta manera:

a = pexpect.spawn('program', env = {"TERM": "dumb"})

Pero esto genera un nuevo shell que no funciona para mí, nuestro entorno de desarrollo depende de muchas variables ambientales: /

Pero si hago esto antes del desove una concha:

import os
os.environ["TERM"] = "dumb"

Cómo cambio el "término" actual y "tonto" no soporta colores, que fijo mi problema.

Otros consejos

No se pudo encontrar nada en la documentación pexpect para el establecimiento de terminales, pero que probablemente podría iniciar su programa de forma explícita con una concha, a continuación, establecer el tipo de terminal que hay:

shell_cmd = 'ls -l | grep LOG > log_list.txt'
child = pexpect.spawn('/bin/bash', ['-c', shell_cmd])
child.expect(pexpect.EOF)

Se podría intentar algo como

child = pexpect.spawn('TERM=vt100 /bin/bash', ['-c', shell_cmd])

También puede iniciar fiesta con --norc y similares para evitar la lectura de los archivos de inicialización. Echa un vistazo a la la página de manual de bash .

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top