python, установить тип терминала в pexpect - PullRequest
4 голосов
/ 11 декабря 2008

У меня есть скрипт, который использует 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 действительно выдает много выходных данных.

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

Я использую tcsh shell

Ответы [ 2 ]

8 голосов
/ 11 декабря 2008

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

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

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

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

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

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

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

2 голосов
/ 11 декабря 2008

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

...