Python中pexpect如何设置终端类型?

4

我有一个脚本,使用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行的 a.before 是乱码,普通打印也无效,即使我看到第5行的命令实际上产生了大量输出。

有人知道问题可能是什么吗?或者在 pexpect 中是否可以设置终端类型以避免颜色?

我正在使用 tcsh shell。

2个回答

9

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

pexpect有一个"env"选项,我认为我可以使用它。像这样:

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

但是这会生成一个新的shell,对我来说不起作用,我们的开发环境依赖于很多环境变量:/

但如果在生成shell之前执行以下操作:

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

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

1
有什么想法为什么在这里使用env=xxx参数的spawn不起作用? - Strin
2
看起来指定的 env 是整个进程获取的所有内容,这意味着它不会获取任何其他环境变量,例如 PATH。这似乎是一个设计不良的 API。对于大多数人来说,正确的用法应该是克隆 os.environ 并在修改后传递,类似于:env = dict(os.environ); env["TERM"] = "dump"; a = pexpect.spawn('program', env=env) - haridsv

2

pexpect文档中找不到有关设置终端的内容,但是您可以通过显式地使用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页面


这个不起作用, 我得到了: raise ExceptionPexpect ('未找到命令或命令不可执行:%s。'%self.command) ExceptionPexpect:未找到命令或命令不可执行:TERM = vt100。我不知道是不是因为我使用tcsh shell。 :/ - Rickard Lindroth

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接