Pergunta

Eu tenho um script que usa pexpect para iniciar um programa CLI. Ele funciona um pouco como um shell onde você obtém um prompt onde você pode digitar alguns comandos.

O problema que tenho, eu acho, é que este programa utiliza uma cor rápida.

Este é o que eu faço

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 é a saída:

> 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 alguma razão a primeira cor prompt de codificação borkens-se as coisas e a.before na linha 8 é ilegível, de impressão normal não funcionar, mesmo se eu ver que o comando na linha 5 realmente produziu um monte de saída.

Alguém sabe qual é o problema poderia ser, ou é possível definir o tipo de terminal em pexpect para evitar as cores?

Eu estou usando shell tcsh

Foi útil?

Solução

Ok, eu encontrei a resposta. A resposta de CSL me colocou no caminho certo.

pexpect tem uma opção "env", que eu pensei que eu poderia usar. assim:

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

Mas Isso gera um novo shell que não funciona para mim, nosso ambiente de desenvolvimento depende de uma série de variáveis ??ambientais: /

Mas se eu fizer isso antes da desova um shell:

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

eu mudar o "TERM" atual e "burro" não suporta cores, que fixa o meu problema.

Outras dicas

Não foi possível encontrar nada no documentação pexpect para definir terminais, mas você poderia provavelmente iniciar o seu programa explicitamente com uma concha, e, em seguida, definir o tipo de terminal lá:

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

Você poderia tentar algo como

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

Você também pode começar a festa com --norc e similares para evitar ler os arquivos de inicialização. Confira o festa página homem .

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top