如何通过命令行将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