Domanda

Ho uno script che utilizza pexpect per avviare un programma CLI. Funziona un po 'come un guscio in cui si ottiene un prompt in cui è possibile inserire alcuni comandi.

Il problema che ho, credo, è che questo programma utilizza un prompt di colore.

Questo è quello che faccio

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)

Questa è l'uscita:

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

Per qualche ragione la prima codifica a colori pronta borkens le cose e A.Before in linea 8 è confuso, la stampa normale non funziona, anche se vedo che il comando in linea 5 in realtà ha prodotto un sacco di uscita.

Qualcuno sa che cosa il problema potrebbe essere, o è possibile impostare il tipo di terminale in pexpect per evitare i colori?

Sto usando shell tcsh

È stato utile?

Soluzione

Ok, ho trovato la risposta. La risposta di csl mi mise sulla strada giusta.

pexpect ha un'opzione "env", che ho pensato che avrei potuto usare. in questo modo:

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

Ma questo genera una nuova shell che non funziona per me, il nostro ambiente di sviluppo dipende da un sacco di variabili ambientali: /

Ma se faccio questo prima deposizione delle uova una shell:

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

a cambiare la "TERM" attuale e "stupido" non supporta i colori, che ha fissato il mio problema.

Altri suggerimenti

Impossibile trovare nulla in il documentazione pexpect per impostare i terminali, ma probabilmente si potrebbe avviare il programma in modo esplicito con un guscio, e quindi impostare il tipo di terminale c'è:

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

Si potrebbe provare qualcosa di simile

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

È anche possibile avviare bash con --norc e simili per evitare la lettura dei file di inizializzazione. Controlla la pagina man bash .

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top