gpt4 book ai didi

python - 如何以编程方式将单元格添加到 IPython 或 Jupyter notebook?

转载 作者:行者123 更新时间:2023-12-04 08:13:00 27 4
gpt4 key购买 nike

这个问题之前已经被问过几次,但是接受的答案表明提问者想做一些与我不同的事情。

我正在尝试创建一个 IPython 小部件来创建并运行一个新单元格。这样做的目的是提供小部件和 IPython 单元之间的相似性。

例如:我想要一个 SelectorWidget,它使用“cell magic”填充并运行下一个单元格。

但我面临的问题是(如果我错了请纠正我)IPython 不保留单元格的内部数据结构。

在我看来,修改新单元格的唯一方法是:

In [1]: get_ipython().set_next_input('1')

In [2]: 1

我只是希望能够自动运行该行。但我认为 set_next_input 是不可能的,因为它只是 readline 之上的 hack。


我可以做我想做的事情:

 display(Javacript('''

var code = IPython.notebook.insert_cell_at_bottom('code'))
code.execute()

'''))

但以这种方式驱动输入感觉非常错误,因为它依赖于网络浏览器来做一些非常简单的事情。而且您依赖于外部事件循环。

与在命令行上执行此操作等效的是启动一个后台线程/进程/协程,它可以访问 IPython 提示符的 stdin 并且会接受来自前台线程的任务以写入前台线程自己的标准输入。这是可能的,但与 Jupyter 方法有同样的问题,因为它特定于 IPython 的输入机制。

最佳答案

从问题来看,我似乎也找不到没有 JavaScript 的完全同步的方法。

我找到了 run_cellrun_cell_magic努力避免使用 JavaScript 示例,但未能生成带有输出的单元格。

我最接近的是:

from IPython import get_ipython

def make_cell_run_code(code):
ipython = get_ipython()
ipython.set_next_input(code)
ipython.run_cell(code)

code = "print('test')"
make_cell_run_code(code)

它避免了 JavaScript 但仍然有不同步的单元格。

在 JavaScript 中,我们可以使用负索引来确保执行相同的单元格。

from IPython.display import Javascript, display

def create_and_excecute_code_cell(code=''):
display(Javascript("""
var code = IPython.notebook.insert_cell_at_bottom('code');
code.set_text("{0}");
Jupyter.notebook.execute_cells([-1]);
""".format(code)))

create_and_excecute_code_cell("%time x=0")

我抄袭了from here .您的 JavaScript 代码段对我不起作用。

其他途径是深入研究 IPython.core.interactiveshell.InteractiveShell

关于python - 如何以编程方式将单元格添加到 IPython 或 Jupyter notebook?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65858199/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com