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 shell

11.12.2008 09:32:43
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 .

2
11.12.2008 09:38:59
Это не сработало, я получаю: повысить ExceptionPexpect ('Команда не найдена или не была выполнена:% s.'% Self.command) ExceptionPexpect: Команда не найдена или не была исполняемой: TERM = vt100. Я не знаю, потому что я использую tcsh shell. : /
Rickard Lindroth 11.12.2008 09:57:24
РЕШЕНИЕ

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

У pexpect есть опция "env", которую я решил использовать. нравится:

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

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

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

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

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

8
13.11.2014 11:57:58
Любая идея, почему спавн с аргументом env = xxx не работает здесь?
Strin 12.01.2016 05:27:02
Похоже, что указанный env - это все, что получает процесс, что означает, что он не получит никаких других переменных среды, таких как PATH. Похоже, это плохо разработанный API. Правильное использование для большинства людей было бы клонировать os.environ и передать это после модификации, что-то вроде:env = dict(os.environ); env["TERM"] = "dump"; a = pexpect.spawn('program', env=env)
haridsv 30.05.2018 07:17:51