python VTE终端的奇怪现象

2 投票
1 回答
2958 浏览
提问于 2025-04-15 22:54

我正在尝试使用Python的终端库VTE(来自Debian Squeeze的python-vte)作为一个虚拟终端模拟器,主要是为了处理ANSI和控制字符的文本。

在交互式的Python控制台中,一切看起来(几乎)都正常:

>>> import vte
>>> term = vte.Terminal()
>>> term.feed("a\nb")
>>> print repr(term.get_text(lambda *a: True).rstrip())
'a\n b'

然而,当我把这段代码(稍微修改过)作为Python脚本运行时,结果却不一样:

$ python vte_wiredness_1.py 
''

奇怪的是,把代码粘贴回(新的)交互式Python会话中也会得到空字符串:

>>> import vte
>>> term = vte.Terminal()
>>> term.feed("a\nb")
>>> print repr(term.get_text(lambda *a: True).rstrip())
''
>>>

我首先想到的就是这两种情况之间唯一的区别是时间——在调用get_text之前应该有一些延迟。不幸的是,在get_text之前加上几秒的睡眠并没有帮助。

接着我想这可能和X窗口环境有关。但在纯Linux控制台中结果也是一样(只是有一些关于缺少图形的警告)。

我想知道是什么导致了这种不可预测的行为(交互式控制台中粘贴和输入的结果不同,而且这和延迟无关……而且交互式控制台似乎和vte终端对象没有关系……我猜)。

有没有人能解释一下发生了什么?是否可以这样使用VTE终端?

输出中的“b”字母前面有个空格,这也是另一种奇怪的现象(所有连续的行前面都有更多的空格……看起来我需要在字符串之前发送回车符)。

我使用的lambda *a: True作为get_text方法的参数是一个虚拟的回调,它是某个SlotSelectedCallback……如果能解释一下这个也会很感激 :)

1 个回答

3

..我在其他地方找到了解决方案,所以我自己发一下。

问题是我忽略了vte.Terminal是一个gtk小程序,所以必须调用gtk的主循环。

这是一个有效代码的例子:

import gtk
import vte

term = vte.Terminal()

term.feed("a\r\nb")

def get_text(term):
    print repr(term.get_text(lambda *a: True).rstrip())    
    gtk.main_quit()

term.connect('contents-changed', get_text)
gtk.main()

感谢Juhaz@irc://freenode.net/##gnome

撰写回答