我找到了一种与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输入功能)。这种方法存在的问题,以及以下问题:
curses.wrapper()
重置终端,并且各种尝试调用.endwin()
,.resetty()
(当然已经执行了.savetty()
之后),.reset_shell_mode()
(和.reset_prog_mode()
)等等都失败了。我尝试在调用curses.wrapper()
之后在main中调用它们,并尝试使用atexit
注册它们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/