【问题标题】:python VTE Terminal weirdnesspython VTE终端怪异
【发布时间】:2010-05-19 19:24:32
【问题描述】:

我正在尝试使用来自 python VTE 绑定的终端(来自 debian 挤压的 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 Term吗?

输出中的“b”字母前面有空格,这是另一个奇怪的地方(所有连续的行前面都有更多的空格..看起来我必须在字符串之前发送回车。)

(我使用的 lambda *a: True get_text 方法参数是一个虚拟回调,它是一些 SlotSelectedCallback.. 对于它的解释,我也将不胜感激 :))

【问题讨论】:

    标签: python terminal gnome vte


    【解决方案1】:

    ..向自己发布我在其他地方找到的解决方案

    问题是我忽略了 vte.Terminal 是一个 gtk 小程序这一事实,因此必须调用 gtk 主循环。

    example of working code:

    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

    【讨论】:

    • 运行gtk.main_quit()如何解决问题?我的 GUI 冻结了。
    • Oleg, gtk.main() 解决了这个问题 - gtk.main_quit() 是终止主事件循环所必需的。但是没有 GUI,我不确定你的意思。
    • 感谢您对这样一个老问题的回复。在我的例子中,我实际上使用的是 GUI。我想在终端的内容发生变化时将它们输出到文件中,但似乎contents-changed 信号并不经常被调用,而且我附加最后一个非空行的方法导致文件中省略了一些行.我认为这个问题很相似。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多