如何通过命令行将IPython Notebook转换为Python文件?

我正在寻找使用* .ipynb文件作为真相的来源,并以编程的方式将它们编译成计划作业/任务的.py文件。

我理解的唯一方法就是通过GUI。 有没有办法通过命令行来做到这一点?

使用--script标志启动笔记本将在每次保存时将.py文件保存在.ipynb旁边。 看一下目前正在合并到IPython中的github / ipython / nbconvert ,所以不要指望这个文档是准确的,而且nbconvert不需要工作就可以开箱即用。 (./nbconvert <format> <file.ipynb>),在[ python ,latex,markdown,full_html,…]中的<format>)

你也可以(如ipynb是JSON),加载它,循环它,并在当前命名空间中eval代码单元。 你会发现在互联网上的例子或在github上的IPython维基。

这个答案太旧,请参阅下面的@williampli的答案。

如果您不希望在每次保存时输出一个Python脚本,或者您不想重新启动IPython内核:

命令行中 ,您可以使用nbconvert

 $ jupyter nbconvert --to script [YOUR_NOTEBOOK].ipynb 

作为一个黑客, 你甚至可以通过预先挂起的方式 IPython笔记本中调用上述命令 ! (用于任何命令行参数)。 在笔记本里面:

 !jupyter nbconvert --to script config_template.ipynb 

--to script之前,选项是--to python--to=python ,但在向与语言无关的笔记本系统中重新命名 。

这里是一个快速和肮脏的方式来从V3或V4 ipynb提取代码,而不使用ipython。 它不检查单元格types等

 import sys,json f = open(sys.argv[1], 'r') #input.ipynb j = json.load(f) of = open(sys.argv[2], 'w') #output.py if j["nbformat"] >=4: for i,cell in enumerate(j["cells"]): of.write("#cell "+str(i)+"\n") for line in cell["source"]: of.write(line) of.write('\n\n') else: for i,cell in enumerate(j["worksheets"][0]["cells"]): of.write("#cell "+str(i)+"\n") for line in cell["input"]: of.write(line) of.write('\n\n') of.close() 

遵循前面的例子,但使用新的nbformat lib版本

 import nbformat from nbconvert import PythonExporter def convertNotebook(notebookPath, modulePath): with open(notebookPath) as fh: nb = nbformat.reads(fh.read(), nbformat.NO_CONVERT) exporter = PythonExporter() source, meta = exporter.from_notebook_node(nb) with open(modulePath, 'w+') as fh: fh.writelines(source.encode('utf-8')) 

您可以从IPython API执行此操作。

 from IPython.nbformat import current as nbformat from IPython.nbconvert import PythonExporter filepath = 'path/to/my_notebook.ipynb' export_path = 'path/to/my_notebook.py' with open(filepath) as fh: nb = nbformat.reads_json(fh.read()) exporter = PythonExporter() # source is a tuple of python source code # meta contains metadata source, meta = exporter.from_notebook_node(nb) with open(export_path, 'w+') as fh: fh.writelines(source) 

@ Spawnrider的最后一行代码,

 fh.writelines(source.encode('utf-8')) 

给出'TypeError:write()参数必须是str,而不是int'

 fh.writelines(source) 

虽然工作。

将当前目录中的所有* .ipynb格式文件recursion转换为python脚本:

 for i in *.ipynb **/*.ipynb; do echo "$i" jupyter nbconvert "$i" "$i" done