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 на самом деле выдала большой объем вывода.
Кто-нибудь знает, в чем может быть проблема, или можно ли установить тип терминала в ожидании, чтобы избежать цветов?
Я использую оболочку tcsh
Решение
Хорошо, я нашел ответ.Ответ csl поставил меня на правильный путь.
В pexpect есть опция «env», которую, как я думал, я мог бы использовать.так:
a = pexpect.spawn('program', env = {"TERM": "dumb"})
Но это порождает новую оболочку, которая не работает для меня, наша среда разработки зависит от многих переменных окружающей среды://
Но если я сделаю это перед созданием оболочки:
import os
os.environ["TERM"] = "dumb"
Я меняю текущий «ТЕРМИН», и «тупой» не поддерживает цвета, что устранило мою проблему.
Другие советы
Не смог найти ничего в ожидаемая документация для настройки терминалов, но вы, вероятно, могли бы запустить свою программу явно с помощью оболочки, а затем установить там тип терминала:
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.