这个问题之前已经有人问过,不过 接受的答案表明提问者想要做的与我想要做的不同。
我正在尝试创建一个IPython小部件(widget),它可以创建和运行新单元(cell)。其目的是为小部件和IPython单元(cell)之间提供相似性。
例如:我想要一个SelectorWidget,它可以用'cell magic'填充并运行下一个单元(cell)。
但是我面临的问题是(如果我理解错了,请纠正),IPython没有保留单元(cell)的内部数据结构。
在我看来,修改新单元(cell)的唯一方法是使用:
In [1]: get_ipython().set_next_input('1')
In [2]: 1
我只是希望能够自动运行那一行代码。但我认为这在set_next_input
中不可能实现,因为它只是在readline
的基础上进行了一些修改。
我可以使用以下方法来实现我的目标:
display(Javacript('''
var code = IPython.notebook.insert_cell_at_bottom('code'))
code.execute()
'''))
但是以这种方式驱动输入感觉非常不对,因为它依赖于Web浏览器来执行一些非常简单的操作。而且你还要依赖一个外部事件循环。
在命令行上进行相当的操作相当于启动一个具有访问IPython提示符的 stdin
的后台线程/进程/协程,并接受前台线程发来的任务将写入到前台线程自己的 stdin
中去。虽然可能做到,但与Jupyter方法具有相同问题,因为它特定于IPython的输入机制。
InteractiveShell
,它具有set_next_input
函数,其行为取决于不同的shell。在Jupyter中,它会向内核发送一个ZeroMQ消息;但在控制台上,我认为它只是readline
的特殊情况。 - Rolipython.run_cell
吗? - chswspandas.display()
。 - Rol