我已经找到一种方法来交互与诅咒的工作,同时还享受着大部分的IPython的好处。 它的工作原理,有一定的局限性,但不是还有我想。
原来的问题,当然,是我希望能够用我的交互式Python会话中工作,同时具有其控制终端屏幕,采用了诅咒(ncurses的)模块(或urwid ,例如)。 一个解决办法是写一个简单的事件循环评估每个其从插座中读取并传回序列化字符串表示,并返回结果字符串一个简单的TCP服务器。 如下所述: SO:有没有办法交互式编程Python的诅咒应用 )。
这里有一个稍微简单诀窍(假设你安装的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)
(略被改写的得到这么的语法高亮高兴)。
运行这将导致输出大致是:
[IPKernelApp] To connect another client to this kernel, use:
[IPKernelApp] --existing kernel-2869.json
并切换到可以运行另一个窗口或屏幕会话:
ipython console --existing kernel-2869.json
要连接到该进程,并使用它。
这是足够好的。 然后,您可以打电话之类的东西stdscr.refresh()
与你的诅咒/窗和垫对象的工作,调用dir()
上他们去探索它们的功能和一般的代码工作,如果你是在这恰好是更新不同的终端屏幕,并从中读取作为一个正常的IPython会话以及(通过诅咒输入功能)。
这种方法存在的问题,以及问题:
- 要退出看来我不得不从IPython的控制台运行退出(),这不正常手段退出解释。 它似乎并不以允许
curses.wrapper()
到终端和各种尝试复位到称为.endwin()
.resetty()
在已经执行的.savetty()
当然),.reset_shell_mode()
和.reset_prog_mode()
等等都失败了。 我试着打电话给他们在主,来电后curses.wrapper()
和我试着注册它们atexit
- 如何干净地从这样的会话退出?
- [Tab]键完成不工作
- 如何获取IPython中的[Tab]键通过IPython的控制台会话完全致力于这些内嵌内核之一?
- 调用IPython的
embed_kernel()
函数打印信息插座至诅咒屏幕,这已经被初始化curses.wrapper()
到那个时候。 这是丑陋的; 此外,如果想要做更多有趣的工作,在诅咒和调用之前embed_kernel()
函数,然后我看不出这是打印到标准输出或通过该功能标准错误的文本。- 怎样使
embed_kernel()
沉默,迫使其注册连接的详细信息通过一些其他的机制呢? 我可以给我自己的套接字名称/路径使用?
- 怎样使
我敢肯定,我会想其他的问题,但我希望其他人会发现这招有用,会发现一些其他的技巧时,我想使用Python诅咒编码玩水,我可以使用。