Question

J'ai un script qui utilise pexpect pour lancer un programme de CLI. Il fonctionne un peu comme une coquille où vous obtenez une invite où vous pouvez entrer des commandes.

Le problème que je dois, je pense, est que ce programme utilise une invite de couleur.

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ée, impression normale ne fonctionne pas, même si je vois que la commande à la ligne 5 effectivement produit beaucoup de la production.

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 shell tcsh

Était-ce utile?

La solution

Ok, j'ai trouvé la réponse. La réponse de csl m'a mis sur le droit chemin.

pexpect a une option "env" que je pensais que je pouvais 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 d'un shell:

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

Je change le « terme » et « stupide » actuel ne prend pas en charge les couleurs, qui ont fixé mon problème.

Autres conseils

Impossible de trouver quoi que ce soit dans la documentation pexpect pour régler les terminaux, mais vous pourriez 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. Consultez le .

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top