我正在尝试使用来自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 ..对于它的解释我也要感激:))< / p>
答案 0 :(得分: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