Терминал Python VTE странность - PullRequest
2 голосов
/ 19 мая 2010

Я пытаюсь использовать терминал из python VTE привязка (python-vte из debian squeeze) в качестве эмулятора виртуального терминала (только для обработки текста ANSI / control chars)

в интерактивной консоли 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 Window. но результаты - та же консоль чистого linux (с некоторым предупреждением об отсутствующей графике).

Интересно, что вызывает такое непредсказуемое поведение (интерактивная консоль - вставляется против введенного текста, и это не задержка ... и интерактивная консоль не имеет ничего общего с терминальным объектом vte .. я думаю)

может кто-нибудь объяснить, что происходит? можно ли использовать термин VTE таким образом?

то, что букве "b" в выходных данных предшествует пробел, является еще одной странностью (всем последовательным строкам предшествует больше пробелов .. похоже, мне нужно отправить возврат каретки перед строкой.)

(аргумент метода lambda *a: True get_text , который я использую, является фиктивным обратным вызовом, это некоторый SlotSelectedCallback .. для его объяснения я также был бы благодарен :) )

1 Ответ

3 голосов
/ 21 мая 2010

.. опубликовать решение, которое я нашел в другом месте

проблема заключалась в том, что я игнорировал тот факт, что 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

...