2012-08-26 47 views
3

我發現了一種與curses交互工作的方式,同時仍然享受着IPython的大部分好處。它有效,但有一些限制,但不如我想。在IPython中使用curses。我該如何改進?

最初的問題當然是,我希望能夠在使用curses(ncurses)模塊(或urwid)控制終端屏幕的同時使用我的交互式Python會話。一種解決方案是用簡單的事件循環編寫一個簡單的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會話中一樣,它正好在更新不同終端的屏幕並從中讀取通過curses輸入功能)。

問題這種方法和問題:

  • 要退出看來我不得不從IPython的控制檯運行退出(),這不正常手段退出解釋。似乎沒有允許curses.wrapper()重置終端,並且嘗試調用.endwin(),.resetty()(當然執行了.savetty()之後),.reset_shell_mode()(和.reset_prog_mode())等都已失敗。我試着打電話給他們在主調用curses.wrapper()後,我已經試過atexit
    • 如何幹淨地從這樣的會話退出註冊呢?
  • [Tab]鍵完成不起作用
    • 如何獲得IPython中的[Tab]鍵通過IPython的控制檯會話完全致力於這些內嵌內核之一?
  • 調用IPython的embed_kernel()函數打印信息插座至詛咒屏幕,它已經由初始化時間由curses.wrapper()。這很醜陋;如果想要做更多有趣的工作,在curses和調用embed_kernel()函數之前,那麼我看不到由該函數打印到stdout或stderr的文本。
    • 我該如何讓embed_kernel()保持沉默並強制它通過其他機制註冊連接細節?我可以給它使用我自己的套接字名稱/路徑嗎?

我敢肯定,我會想其他的問題,但我希望其他人會發現這招有用,會發現一些其他的技巧時,我想使用Python詛咒編碼玩水,我可以使用。

回答

1

我已經找到了答案選項卡後,您可以獲取使用get_ipython() IPython的殼對象,然後調用init_completer()它:

get_ipython().init_completer() 

應該可以獲取內核和其關閉,也要退出終端應用程序,但是到目前爲止,對文檔進行爬取還沒有發現如何。

7

事實證明,我們現在可以以相當自然的方式使用IPython與curses交互工作。

從一個終端只需鍵入:

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] -completion等。

注意[Ctrl]鍵 - [d]將提供退出IPython的控制檯(客戶端),而quit()將關閉IPython的內核(遠程窗口---服務器)。

但是,總的來說,這個模型比我去年在我的問題中描述的更清晰,更容易。我不知道它是IPython的新版本(0.13.1),還是簡單的無知,使我以前的嘗試有點笨拙。

+2

嗨吉姆,我是IPython的開發人員之一 - 這是一個酷玩ncurses/urwid的好方法,謝謝分享! 「ipython內核」入口點在0.12中可用。這個技巧也適用於'ipython notebook'和'ipython qtconsole'入口點! –