Странность терминала VTE на Python

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

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

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

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

(аргумент метода lambda *a: True 1Vte

>>> import vte
>>> term = vte.Terminal()
>>> term.feed("a\nb")
>>> print repr(term.get_text(lambda *a: True).rstrip())
'a\n b'
1Terminal.html#a5ea58027108d5c27d51882a8b1392e44" rel="nofollow noreferrer">get_text, который я использую, является фиктивный обратный вызов, это какой-то 1slot.html" rel="nofollow noreferrer">SlotSelectedCallback.. за его объяснение i' буду тоже благодарен))


person mykhal    schedule 19.05.2010    source источник


Ответы (1)


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

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

person mykhal    schedule 21.05.2010
comment
Как запуск gtk.main_quit() решает проблему? Мой графический интерфейс зависает. - person Oleg Vaskevich; 02.08.2012
comment
Олег, gtk.main() решает вопрос - gtk.main_quit() необходимо завершить основной цикл обработки событий. Но нет графического интерфейса, я не уверен, что вы имеете в виду. - person mykhal; 03.08.2012
comment
Спасибо за ответ на такой старый вопрос. В моем случае я фактически использую графический интерфейс. Я хотел выводить содержимое терминала в файл по мере его изменения, но, похоже, сигнал contents-changed вызывается нечасто, и мой метод добавления последней непустой строки привел к тому, что некоторые строки были исключены из файла. Я думал, что этот вопрос был похож. - person Oleg Vaskevich; 04.08.2012