6

IPython のほとんどの利点を享受しながら、curses をインタラクティブに操作する方法を見つけました。いくつかの制限はありますが、私が望むほどには機能しません。

もちろん、元の問題は、curses (ncurses) モジュール (またはurwidなど) を使用して、端末画面を制御しながらインタラクティブな Python セッションで作業できるようにしたいということです。1 つの解決策は、ソケットから読み取った各文字列を評価し、結果を表すシリアル化された文字列を送り返し、結果を返す単純なイベント ループを備えた単純な TCP サーバーを作成することです。ここで説明されているように: SO: Is there a way to interactively program a Python curses Application )。

これはやや単純なトリックです (IPython がインストールされていると仮定します)。

    #!/usr/bin/python 
    #!/usr/bin/env python 
    from IPython import embed_kernel
    import curses

    def interact_with_curses(screen):
        '''set global stdscr variable and run embedded IPython kernel
           suitable to be called by curses.wrapper()
        '''
        global stdscr
        stdscr = screen
        embed_kernel()

    if __name__ == '__main__':
        curses.wrapper(interact_with_curses)

(SO のシンタックスハイライトを満足させるために少し変更されています)。

これを実行すると、おおよそ次のような出力が得られます。

 [IPKernelApp] To connect another client to this kernel, use:
            [IPKernelApp] --existing kernel-2869.json

そして、実行できる別のウィンドウまたはスクリーン セッションに切り替えます。

ipython console --existing kernel-2869.json

そのプロセスに接続して作業すること。

これで十分です。その後、次のようなものを呼び出すことができますstdscr.refresh()。curses/window および pad オブジェクトを操作し、それらを呼び出しdir()てそれらの機能を探索し、通常の IPython セッションにいるかのようにコードを操作します。通常の IPython セッションでは、たまたま別の端末の画面が更新され、そこからも読み取られます ( curses 入力関数)。

このアプローチの問題点と質問:

  • 終了するには、IPython コンソールから quit() を実行する必要があるようですが、これは通常の方法ではインタープリターを終了しません。curses.wrapper()端末のリセットが許可されていないようで、(もちろんa を実行した後) .endwin()、(および) などを呼び出すさまざまな試みがすべて失敗しました。への呼び出しの後にメインでそれらを呼び出してみましたが、それらを登録しようとしました.resetty().savetty().reset_shell_mode().reset_prog_mode()curses.wrapper()atexit
    • そのようなセッションをきれいに終了するにはどうすればよいですか?
  • [タブ]補完が効かない
    • これらの組み込みカーネルの 1 つへの IPython コンソール セッションを介して、IPython の [Tab] を完全に機能させるにはどうすればよいですか?
  • IPythonembed_kernel()関数を呼び出すと、ソケット情報が curses 画面に出力されます。この画面は、その時点までにすでに初期化さcurses.wrapper()れています。これは醜いです。また、より興味深い作業を行いたい場合、curses でembed_kernel()関数を呼び出す前に、その関数によって stdout または stderr に出力されたテキストが表示されません。
    • embed_kernel()サイレントにして、他のメカニズムを介して接続の詳細を登録するにはどうすればよいですか? 使用する独自のソケット名/パスを指定できますか?

私は他の質問を考えると確信していますが、他の人がこのトリックを便利だと思ってくれ、Python curses コーディングに手を出したいときに使用できる他のトリックを見つけてくれることを願っています.

4

2 に答える 2

8

curses をインタラクティブに操作するために、かなり自然な方法で IPython を使用できるようになりました。

1 つの端末から次のように入力するだけです。

ipython kernel

これにより、次のような行が出力されます。

[IPKernelApp] To connect another client to this kernel, use:
[IPKernelApp] --existing kernel-14321.json

別の端末/ウィンドウ タイプから:

ipython console --existing kernel-14321.json

...そして、一見完全に通常の IPython セッションになります。唯一の違いは、実際には別のウィンドウで「リモート」IPython カーネル セッションにアクセスしていることです。そこから、curses 関数を使用したり、他のウィンドウで変更を確認したり、入力を入力したり、[Tab] 補完を使用したりできます。

[Ctrl]-[D] は IPythonコンソール(クライアント) をquit()終了し、IPythonカーネルを閉じます(リモート ウィンドウ --- サーバー)。

しかし、全体として、このモデルは昨年の質問で説明したものよりもクリーンで簡単です。それがIPythonの新しいバージョン(0.13.1)なのか、それとも単純な無知が以前の試みをやや不格好にしたのかはわかりません。

于 2013-03-17T04:56:35.730 に答える
2

タブ補完に対する答えを見つけました。 を使用して IPython シェル オブジェクトを取得しget_ipython()、それを呼び出すことができますinit_completer()

get_ipython().init_completer()

カーネルを取得してシャットダウンし、端末アプリケーションを終了することもできるはずですが、ドキュメントをクロールしても、その方法はまだ明らかにされていません。

于 2012-08-31T09:41:45.347 に答える