2008-12-11 11 views
4

J'ai un script qui utilise pexpect pour démarrer un programme CLI. Cela fonctionne un peu comme un shell où vous obtenez une invite où vous pouvez entrer certaines commandes.python, définir le type de terminal dans pexpect

Le problème que j'ai, je pense, est que ce programme utilise une invite colorée.

C'est ce que je fais

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) 

Ceci est la sortie:

> 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>' 

Pour une raison quelconque le premier codage couleur rapide borkens des choses et a.before à la ligne 8 est brouillées, normal L'impression ne fonctionne pas, même si je vois que la commande à la ligne 5 a produit beaucoup de sortie.

Est-ce que quelqu'un sait ce que le problème pourrait être, ou est-il possible de définir le type de terminal dans pexpect pour éviter les couleurs?

J'utilise tcsh

Répondre

8

Ok, j'ai trouvé la réponse. La réponse de CSL m'a mis sur la bonne voie.

pexpect a une option "env" que je pensais pouvoir utiliser. comme ceci:

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

Mais engendre une nouvelle coquille qui ne fonctionne pas pour moi, notre environnement de développement dépend de beaucoup de variables environnementales:/

Mais si je le fais avant la ponte une coquille: Je change le "TERM" actuel et "stupide" ne supporte pas les couleurs, ce qui a résolu mon problème.

+1

une idée pourquoi spawn avec env = xxx argument ne fonctionne pas ici? – Strin

2

Impossible de trouver quoi que ce soit dans the pexpect documentation pour régler les terminaux, mais vous pouvez probablement commencer votre programme explicitement avec une coquille, puis définissez le type de terminal là:

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

Vous pouvez essayer quelque chose comme

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

Vous pouvez également lancer bash avec --norc et similaire pour éviter de lire les fichiers d'initialisation. Découvrez le bash man page.

+0

Cela n'a pas fonctionné, je reçois: augmentation ExceptionPexpect (« La commande n'a pas été trouvé ou n'a pas été exécutable:% s. » % Self.command) ExceptionPexpect: La commande n'a pas été trouvé ou n'a pas été exécutable: TERM = vt100. Je ne sais pas si c'est parce que j'utilise tcsh shell. :/ –

Questions connexes