python VTE终端的奇怪现象
我正在尝试使用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