2

背景: readline モジュールをインポートして使用し、自家製のコマンド ライン インターフェイスを構築する Python プログラムがあります。そのCLIのフロントエンドとして機能する2番目のpythonプログラム(ボトル、Webマイクロフレームワークを中心に構築)があります。2 番目の python プログラムは、パイプのようなインターフェイスを最初の python プログラムに開き、基本的にユーザー入力と CLI 出力を 2 つの間でやり取りします。

問題:外側のラッパー プログラム (Web インターフェイス) で、エンドユーザーが TAB キー (または readline complete 関数をバインドするその他のキー) を押すたびに、readline complete 関数を起動せずにそのキーが CLI の stdin に挿入されます。 . 通常、対話型 CLI セッション中に発生するように、代わりに readline のコマンド補完機能をトリガーするためにこれが必要です。

考えられる解決策 #1:サブプロセスの stdin に TAB キーを送信して、バッチの使用がインタラクティブな使用と同じように機能する方法はありますか?

考えられる解決策 #2:または、完了プロセス全体 (一致の生成表示を含む) を手動でトリガーする方法があれば、 のような特別なテキスト シーケンスを挿入してスキャンし"<TAB_KEY_HERE>"、可能な完了一致表示関数を手動で起動することができます。(可能な一致を生成するコンプリータ関数を作成したので、実際に必要なのは、可能な一致を表示する readline の関数にアクセスすることだけです。)

考えられる解決策 #3: readline の matches-display 関数にアクセスできない場合、最後のオプションは、readline の組み込みの表示補完関数を書き直して、直接呼び出せるようにすることだと思います。:(

より良い解決策はありますか?上記のソリューションのいずれかによって提示されたパスに従うことに関する提案はありますか? 私は#1と#2で立ち往生しており、#3を避けようとしています.

ありがとう!

4

1 に答える 1

1

解決策 1は実行可能なアプローチであることが証明されました。重要なのは、Web ソケットを CLI アプリに直接接続しないことでした。どうやら、readline は実際の PTY/TTY に接続されていないため、すべての TAB を除外する単純なモードに戻っていたようです。(私はこれを正確に覚えていないかもしれません。多くのクモの巣が形成されています。) 代わりに、PTY/TTY ペアを開いて、CLI アプリと Web ソケット アプリの間に挿入する必要がありました。次のように、実際のキーボードベースの端末に接続します。

import pty
masterPTY, slaveTTY = pty.openpty()
appHandle = subprocess.Popen(
    ['/bin/python', 'myapp.py'],
    shell=False,
    stdin=slaveTTY,
    stdout=slaveTTY,
    stderr=slaveTTY,
    )
...
while True
    # read output from CLI app
    output = os.read(masterPTY, 1024)
    ...
    # write output to CLI app
    while input_data:
        chars_written = os.write(masterPTY, input_data)
        input_data = input_data[chars_written:]
    ...
appHandle.terminate()
os.close(masterPTY)
os.close(slaveTTY)

HTH 他の誰か。:)

背景の詳細​​については、関連する質問に対するこの回答を参照してください。

https://stackoverflow.com/a/14565848/538418

于 2013-11-04T18:21:46.523 に答える