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

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

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

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

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
4
0
12 543
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Не удалось найти ничего в документация 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.

Это не сработало, я получаю: raise ExceptionPexpect ('Команда не была найдена или не выполнялась:% s.'% Self.command) ExceptionPexpect: Команда не была найдена или не выполнялась: TERM = vt100. Не знаю, потому что я использую tcsh shell. : /

Rickard Lindroth 11.12.2008 12:57
Ответ принят как подходящий

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

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

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

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

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

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

Я меняю текущий «TERM», и «dumb» не поддерживает цвета, что устранило мою проблему.

любая идея, почему спавн с аргументом env = xxx здесь не работает?

Strin 12.01.2016 08:27

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

haridsv 30.05.2018 10:17

Другие вопросы по теме