Frage

Ich habe ein Skript, das pexpect verwendet ein CLI-Programm zu starten. Es funktioniert ein wenig wie eine Muschel, wo Sie eine Aufforderung erhalten, wo Sie einige Befehle eingeben können.

Das Problem, das ich habe, glaube ich, ist, dass dieses Programm eine farbige Prompt verwendet wird.

Das ist, was ich tun

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)

Dies ist die Ausgabe:

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

Aus irgendeinem Grunde die erste schnellen Farbcodierung borkens up Dinge und a.before in Zeile 8 wird verstümmelt, Normaldruck funktioniert nicht, auch wenn ich sehe, dass der Befehl in Zeile 5 tatsächlich eine Menge Ausgabe erzeugt.

Hat jemand wissen, was das Problem sein könnte, oder ist es möglich, den Terminaltyp in pexpect zu setzen, die Farben zu vermeiden?

Ich bin mit tcsh Shell

War es hilfreich?

Lösung

Ok, fand ich die Antwort. csl Antwort setzte mich auf dem richtigen Weg.

pexpect hat eine „env“ Option, die ich dachte, ich könnte. wie folgt aus:

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

Aber das laicht eine neue Schale, die für mich nicht funktioniert, unsere Entwicklungsumgebung hängt von einer Vielzahl von Umgebungsvariablen: /

Aber wenn ich dies tun, bevor eine Shell Laichen:

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

ich ändern, um die aktuelle „TERM“ und „dumme“ Farben nicht unterstützt, die mein Problem behoben.

Andere Tipps

kann nicht alles in der pexpect Dokumentation finden Terminals für die Einstellung, aber man kann wahrscheinlich starten Sie Ihr Programm explizit mit einer Schale, und dann den Terminaltyp eingestellt es:

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

Sie könnten versuchen, so etwas wie

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

Sie können auch die Initialisierung Dateien lesen bash mit --norc und ähnliches zu vermeiden starten. Schauen Sie sich die bash Manpage rel="nofollow.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top