在IPython的诅咒工作。 我怎样才能提高呢?(Working with curses in

2019-07-31 04:24发布

我已经找到一种方法来交互与诅咒的工作,同时还享受着大部分的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诅咒编码玩水,我可以使用。

Answer 1:

It turns out that we can now just use IPython in a fairly natural manner for interactively working with curses.

From one terminal simply type:

ipython kernel

This will print a line something like:

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

From another terminal/window type:

ipython console --existing kernel-14321.json

... and you'll be in a seemingly perfectly normal IPython session. The only difference will be that you're actually accessing the "remote" IPython kernel session in the other window. From there you'll be able to use curses functions, see changes in the other window, type inputs thereto, use [Tab]-completion, and so on.

Note that [Ctrl]-[D] will offer to exit the IPython console (client) while quit() will close the IPython kernel (remote window --- server).

But, overall this model is cleaner and easier then what I described in my question last year. I don't know if it's the newer version of IPython (0.13.1) or if was simple ignorance that made my previous attempts somewhat clunkier.



Answer 2:

我已经找到了答案选项卡后,您可以使用获得的IPython Shell对象get_ipython()然后调用init_completer()就可以了:

get_ipython().init_completer()

它应该是可以获取内核和将其关闭,退出终端应用,太多,但文档爬来爬去至今没有发现如何。



文章来源: Working with curses in IPython. How can I improve this?