2008-12-11 76 views
4

我有一个使用pexpect启动CLI程序的脚本。它有点像一个shell,你可以在其中输入一些命令。python,在终端中设置终端类型

我认为,我有这个问题,该程序使用彩色提示。

这是我做的

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行borkens起来的东西,a.before是乱码,正常打印不起作用,即使我看到第5行的命令实际上产生了很多输出。

有人知道问题出在哪里,或者是否可以设置终端类型以避免颜色?

我使用tcsh外壳

回答

8

好吧,我找到了答案。 csl的回答让我走上了正确的道路。

pexpect有一个我认为可以使用的“env”选项。像这样:

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

但是,这产生一个新的外壳不工作对我来说,我们的开发环境 取决于很多环境变量:/

但是,如果我生成一个壳之前做到这一点:

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

我改变当前的“TERM”和“哑”不支持颜色,这解决了我的问题。

+1

任何想法为什么产生env = xxx参数在这里不起作用? – Strin 2016-01-12 05:27:02

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 man page

+0

这不起作用, 我得到: 提高ExceptionPexpect(“命令未找到或无法执行:%s”的%self.command) ExceptionPexpect:命令找不到或不可执行:TERM = VT100。 我不知道是否因为我使用tcsh shell。 :/ – 2008-12-11 09:57:24