2

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())
''
>>>

最初に頭に浮かんだのは、2 つのケースの唯一の違いはタイミングであるということでしたget_text。残念ながら、get_text数秒の睡眠で前奏曲をしても役に立ちませんでした

それから、Xウィンドウ環境と関係があると思いました。ただし、結果は同じ純粋な Linux コンソールです (グラフィックスの欠落に関する警告がいくつかあります)。

このような予測不可能な動作の原因は何なのだろうか (対話型コンソール - 貼り付け対入力、遅延ではない.. 対話型コンソールは vte 端末オブジェクトとは何の関係もない.. 推測する)

誰かが何が起こっているのか説明できますか? そのような方法で VTE 用語を使用することは可能ですか?

出力の「b」文字の前にスペースがあることは、別の奇妙さです(すべての連続する行の前にさらにスペースがあります..文字列の前にキャリッジリターンを送信する必要があるようです。)

(私が使用しているlambda *a: True get_textメソッドの引数はダミーのコールバックです。それはいくつかのSlotSelectedCallbackです..その説明についても感謝します:))

4

1 に答える 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

于 2010-05-21T09:36:17.517 に答える