从Python脚本执行IPython笔记本单元格

7
在IPython笔记本中,您可以使用"run magic"执行外部脚本文件,比如test.py
%run test.py

有没有一种方法可以反过来做,即在Python脚本中访问并运行IPython笔记本中的特定单元格?


IPython有类似XML的格式。您可以解析它并运行所需的单元格。 - keiv.fly
1个回答

6

Jupyter(或IPython)的扩展名为“ipynb”的文件是JSON文件。单元格位于名称为“cells” ["cells"]的位置下。然后,选择单元格[0]的编号,并选择“source” ["source"]以获取源代码。您将得到一个包含一个元素的数组,因此需要获取第一个元素[0]。

>>> import json
>>> from pprint import pprint
>>> with open('so1.ipynb', 'r') as content_file:
...     content = content_file.read()
... 
>>> data=json.loads(content)
>>> data["cells"][0]["source"][0]
'1+1'
>>> eval(data["cells"][0]["source"][0])
2
>>> data["cells"][1]["source"][0]
'2+2'
>>> eval(data["cells"][1]["source"][0])
4

编辑:

要在使用%run的单元格中运行其他Python脚本:

os.system(data["cells"][2]["source"][0].replace("%run ",""))

如果您使用了 -i 选项,则可将其替换为以下内容:
execfile(data["cells"][2]["source"][0].replace("%run -i ",""))

请查看如何在一个Python脚本中运行另一个带参数的Python脚本,以获取更多信息。


谢谢。如果单元格中有jupyter/ipython特定的魔法命令,比如%run,我能做些什么呢? - Alex
你好,我有一个笔记本可以绘制图形,但是当我使用这种方法执行该单元格时,我没有得到任何输出。有什么解决办法吗? - Eternal
需要检查的事项:末尾是否有plt.show(),是否使用了兼容的matplotlib后端。在Jupyter中使用交互式后端与纯Python不兼容。 - keiv.fly

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接