我有一个使用pexpect启动CLI程序的脚本。它的工作方式有点像shell,你可以在其中输入一些命令。
我认为,我遇到的问题是该程序使用彩色提示。
这就是我的工作
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
答案 0 :(得分:8)
好的,我找到了答案。 csl的回答让我走上了正确的道路。
pexpect有一个“env”选项,我认为我可以使用它。像这样:
a = pexpect.spawn('program', env = {"TERM": "dumb"})
但是这会产生一个新的shell,它不适合我,我们的开发环境 取决于很多环境变量:/
但如果我在产生shell之前这样做:
import os
os.environ["TERM"] = "dumb"
我更改了当前的“TERM”和“哑”不支持颜色,这解决了我的问题。
答案 1 :(得分:2)
在the pexpect documentation中无法找到设置终端的任何内容,但您可以使用shell显式启动程序,然后在那里设置终端类型:
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])
您也可以使用--norc和类似的方式启动bash以避免读取初始化文件。查看bash man page。