pitão, definido o tipo de terminal em pexpect
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
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 .