我可以用吗pexpect
以忽略输出中的 ANSI 转义码(尤其是颜色)的方式?我正在尝试这样做:
expect('foo 3 bar 5')
...but 有时我得到带有 ANSI 颜色数字的输出。问题是我不知道哪些数字有 ANSI 颜色,哪些没有。
有没有办法使用pexpect
但它是否会忽略子进程响应中的 ANSI 序列?
这是一个并不完全令人满意的提案,对 pexpect 类的 2 个例程进行子类化pexpect.Expecter
and pexpect.spawn
这样传入的数据可以在添加到缓冲区并测试模式匹配之前删除转义序列。这是一个惰性实现,因为它假设任何转义序列总是以原子方式读取,但处理分割读取更加困难。
# https://stackoverflow.com/a/59413525/5008284
import re, pexpect
from pexpect.expect import searcher_re
# regex for vt100 from https://stackoverflow.com/a/14693789/5008284
class MyExpecter(pexpect.Expecter):
ansi_escape = re.compile(rb'\x1B[@-_][0-?]*[ -/]*[@-~]')
def new_data(self, data):
data = self.ansi_escape.sub(b'', data)
return pexpect.Expecter.new_data(self, data)
class Myspawn(pexpect.spawn):
def expect_list(self, pattern_list, timeout=-1, searchwindowsize=-1,
async=False):
if timeout == -1:
timeout = self.timeout
exp = MyExpecter(self, searcher_re(pattern_list), searchwindowsize)
return exp.expect_loop(timeout)
这假设您使用expect()
调用一个列表,然后执行
child = Myspawn("...")
rc = child.expect(['pat1'])
由于某种原因,在解码之前获取数据时,我必须使用字节而不是字符串,但这可能只是因为当前的区域设置环境不正确。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)