我發現了一種與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詛咒編碼玩水,我可以使用。
嗨吉姆,我是IPython的開發人員之一 - 這是一個酷玩ncurses/urwid的好方法,謝謝分享! 「ipython內核」入口點在0.12中可用。這個技巧也適用於'ipython notebook'和'ipython qtconsole'入口點! –