python, установите тип терминала в pexpect

У меня есть скрипт, который использует pexpect для запуска программы CLI. Это немного похоже на оболочку, где вы получаете подсказку, в которой вы можете ввести некоторые команды.

У меня проблема, я думаю, в том, что эта программа использует цветную подсказку.

Это то чем я занимаюсь

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)

Это результат:

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

По какой-то причине первая подсказка с цветовым кодированием все искажает, и a.before в строке 8 искажена, обычная печать не работает, даже если я вижу, что команда в строке 5 на самом деле произвела много вывода.

Кто-нибудь знает, в чем может быть проблема, или можно ли установить тип терминала в pexpect, чтобы избежать цветов?

Я использую оболочку tcsh


person Rickard Lindroth    schedule 11.12.2008    source источник


Ответы (2)


Хорошо, я нашел ответ. Ответ csl поставил меня на правильный путь.

pexpect имеет опцию «env», которую, как я думал, я мог бы использовать. как это:

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

Но это порождает новую оболочку, которая у меня не работает, наша среда разработки зависит от множества переменных среды:/

Но если я сделаю это перед созданием оболочки:

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

Я изменил текущий «ТЕРМИН», а «тупой» не поддерживает цвета, что решило мою проблему.

person Rickard Lindroth    schedule 11.12.2008
comment
есть идеи, почему спавн с аргументом env=xxx здесь не работает? - person Strin; 12.01.2016
comment
Похоже, что указанная среда — это все, что получает процесс, а это значит, что он не получит никаких других переменных среды, таких как PATH. Похоже, это плохо спроектированный API. Правильным использованием для большинства людей будет клонирование os.environ и передача его после модификации, что-то вроде: env = dict(os.environ); env["TERM"] = "dump"; a = pexpect.spawn('program', env=env) - person haridsv; 30.05.2018

Не удалось найти ничего в документации pexpect по настройке терминалов, но вы, вероятно, могли бы запустить свою программу явно с оболочкой, а затем установить там тип терминала:

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

Вы можете попробовать что-то вроде

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

Вы также можете запустить bash с параметром --norc и подобным, чтобы не читать файлы инициализации. Посетите справочную страницу bash.

person csl    schedule 11.12.2008
comment
Это не сработало, я получаю: поднять ExceptionPexpect ("Команда не была найдена или не была выполнена: %s." % self.command) ExceptionPexpect: Команда не была найдена или не была выполнена: TERM=vt100. Я не знаю, потому ли это, что я использую оболочку tcsh. :/ - person Rickard Lindroth; 11.12.2008