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] を完全に機能させるにはどうすればよいですか?
- IPython
embed_kernel()
関数を呼び出すと、ソケット情報が curses 画面に出力されます。この画面は、その時点までにすでに初期化さcurses.wrapper()
れています。これは醜いです。また、より興味深い作業を行いたい場合、curses でembed_kernel()
関数を呼び出す前に、その関数によって stdout または stderr に出力されたテキストが表示されません。embed_kernel()
サイレントにして、他のメカニズムを介して接続の詳細を登録するにはどうすればよいですか? 使用する独自のソケット名/パスを指定できますか?
私は他の質問を考えると確信していますが、他の人がこのトリックを便利だと思ってくれ、Python curses コーディングに手を出したいときに使用できる他のトリックを見つけてくれることを願っています.