我找到了一种与curses交互工作的方法,同时仍然可以享受IPython的大部分好处。它可以工作,但有一些限制,但不如我所希望的那样。

当然,最初的问题是,我希望能够使用curses(ncurses)模块(例如urwid)在交互式Python session 控制终端屏幕的同时进行操作。一种解决方案是编写一个具有简单事件循环的简单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

并切换到另一个窗口或屏幕 session ,您可以运行:
ipython console --existing kernel-2869.json

连接到该过程并使用它。

这足够好了。然后,您可以调用诸如stdscr.refresh()之类的东西。使用curses/window和pad对象,在它们上调用dir()以探索其功能,并且通常像在普通IPython session 中一样使用该代码,而这恰好是在更新另一个终端的屏幕并从中读取(通过curses输入功能)。

这种方法存在的问题,以及以下问题:
  • 要退出,似乎我必须从IPython控制台运行quit(),但这并不能以通常的方式退出解释器。似乎不允许curses.wrapper()重置终端,并且各种尝试调用.endwin().resetty()(当然已经执行了.savetty()之后),.reset_shell_mode()(和.reset_prog_mode())等等都失败了。我尝试在调用curses.wrapper()之后在main中调用它们,并尝试使用atexit注册它们
  • 我如何干净地退出此类 session ?
  • [Tab]完成不起作用
  • 如何通过IPython的[Tab]完全通过IPython控制台 session 访问这些嵌入式内核之一?
  • 调用IPython的embed_kernel()函数会将套接字信息打印到curses屏幕上,该屏幕当时已由curses.wrapper()初始化。这是丑陋的。同样,如果想做更多有趣的工作,在诅咒中以及在调用embed_kernel()函数之前,我将看不到该函数打印到stdout或stderr的文本。
  • 如何使embed_kernel()保持沉默,并通过其他机制强制其注册连接详细信息?我可以给它自己使用的套接字名称/路径吗?

  • 我确定我会想到其他问题,但是我希望其他人会发现这个技巧很有用,并且会发现我想涉足Python curses编码时可以使用的其他技巧。

    最佳答案

    事实证明,我们现在可以以相当自然的方式使用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 session 。唯一的区别是您实际上是在另一个窗口中访问“远程” IPython内核 session 。从那里,您将能够使用curses函数,在另一个窗口中查看更改,在其中键入输入,使用[Tab]补全,等等。

    请注意,[Ctrl]-[D]将提供退出IPython 控制台(客户端)的功能,而quit()将关闭IPython 内核(远程窗口---服务器)。

    但是,总体而言,此模型比我去年在问题中描述的模型更干净,更容易。我不知道这是IPython的较新版本(0.13.1),还是由于简单的无知使我以前的尝试显得有些笨拙。

    关于python - 在IPython中使用curses。我该如何改善呢?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12128691/

    10-12 20:32