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

如何通过命令行将IPython笔记本转换为Python文件?,ipython,ipython-notebook,Ipython,Ipython Notebook,我正在考虑使用*.ipynb文件作为真相的来源,并通过编程将它们“编译”成.py文件,以用于计划的作业/任务 我理解这样做的唯一方法是通过GUI。是否有办法通过命令行执行此操作?如果不希望每次保存时都输出Python脚本,或者不希望重新启动IPython内核: 在命令行上,您可以使用: 作为一种黑客,您甚至可以通过预挂起在IPython笔记本中调用上述命令(用于任何命令行参数)。在笔记本内: !jupyter nbconvert --to script config_template.ipynb

我正在考虑使用*.ipynb文件作为真相的来源,并通过编程将它们“编译”成.py文件,以用于计划的作业/任务


我理解这样做的唯一方法是通过GUI。是否有办法通过命令行执行此操作?

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

在命令行上,您可以使用:

作为一种黑客,您甚至可以通过预挂起
在IPython笔记本中调用上述命令(用于任何命令行参数)。在笔记本内:

!jupyter nbconvert --to script config_template.ipynb

--to script
之前,选项是
--to python
--to=python
,但它正朝着一个语言不可知的笔记本系统发展。

您可以通过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)

下面是一种快速而肮脏的方法,可以在不使用ipython的情况下从V3或V4 ipynb中提取代码。它不检查单元格类型等

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'))

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

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

如果要将当前目录中的所有
*.ipynb
文件转换为python脚本,可以按如下方式运行命令:

jupyter nbconvert --to script *.ipynb

我遇到了这个问题,并试图在网上找到解决方案。虽然我找到了一些解决方案,但它们仍然存在一些问题,例如,当您从仪表板启动新笔记本时,恼人的
Untitled.txt
自动创建

最后我写道:

要使用此脚本,可以将其添加到
~/.jupyter/jupyter\u notebook\u config.py
:)

请注意,您可能需要重新启动jupyter笔记本电脑/实验室才能使其工作。

很高兴您的工具链中有这样的转换。它不仅允许从笔记本到脚本的转换,而且还可以从脚本返回到笔记本。甚至把那本笔记本做成了成品

jupytext --to py notebook.ipynb                 # convert notebook.ipynb to a .py file
jupytext --to notebook notebook.py              # convert notebook.py to an .ipynb file with no outputs
jupytext --to notebook --execute notebook.py    # convert notebook.py to an .ipynb file and run it 

有一个非常好的包,名为,它是为在Jupyter笔记本中编写Python包而设计的。与nbconvert类似,
它可以将笔记本转换为.py文件,但它更灵活、更强大,因为它有许多很好的附加创作功能,可以帮助您在PyPI上开发测试、文档和注册软件包。它是由fast.ai开发的


它有一点学习曲线,但文档很好,总体来说并不困难。

下面的示例将一个名为
a_Notebook.ipynb
的铁皮Python笔记本变成了一个名为
a_Python_script.py
的Python脚本,省去了标记有关键字
remove
的单元格,我手动将其添加到我不想在脚本中结束的单元格中,忽略了可视化和其他步骤,这些步骤在我完成笔记本后,不需要脚本执行

import nbformat as nbf
from nbconvert.exporters import PythonExporter
from nbconvert.preprocessors import TagRemovePreprocessor

with open("a_notebook.ipynb", 'r', encoding='utf-8') as f:
    the_notebook_nodes = nbf.read(f, as_version = 4)

trp = TagRemovePreprocessor()

trp.remove_cell_tags = ("remove",)

pexp = PythonExporter()

pexp.register_preprocessor(trp, enabled= True)

the_python_script, meta = pexp.from_notebook_node(the_notebook_nodes)

with open("a_python_script.py", 'w', encoding='utf-8') as f:
    f.writelines(the_python_script)

我知道这是一条旧线。我也遇到了同样的问题,希望通过命令行将.pynb文件转换为.py文件

我的搜寻把我带到了

通过以下步骤,我能够获得.py文件

  • 安装“pip安装ipynb py转换”
  • 通过命令提示符转到保存ipynb文件的目录
  • 输入命令
  • >ipynb py convert YourFileName.ipynb YourFileName.py

    例:。ipynb py convert getting-started-with-kaggle-titanic-problem.ipynb getting-started-with-kaggle-titanic-problem.py


    上面的命令将创建一个名为“YourFileName.py”的python脚本,根据我们的示例,它将在我的mint[ubuntu]系统上创建
    开始使用kaggle titanic problem.py
    文件

    ,即使jupyter已经安装,笔记本也可以使用,
    jupyter-nbconvert--to-script
    给出了错误,在我做单独的测试之前,没有文件/目录

    sudo apt-get install jupyter-nbconvert
    

    然后一切都很好的转换。我只是想添加此项,以防任何人遇到相同的错误(对我来说,这是令人困惑的,因为我认为无文件错误指的是笔记本,它肯定在本地目录中,我花了一段时间才意识到没有安装子命令)。

    你所说的“真相来源”是什么意思?IPython笔记本只是json文件。您可以加载它们并作为Python字典进行操作。对于源代码,您应该迭代
    输入
    键,其中
    单元格类型
    等于“code”。看看这个,我想将.ipynb存储在存储库中,而不是.py文件。因此,作为“构建步骤”,我将把.ipynb转换为.py文件,供自动化系统实际使用。你说得对,我可以加载json并只输出代码单元格,但我想知道是否有什么东西已经为我做到了:)@StefanKrawczyk你能把一个aswer标记为已接受吗?我建议您使用wwwilliam的Asnweri,如果您确实希望每次保存一个,那么在
    jupyter
    中,您可以通过保存前或保存后挂钩触发
    nbconvert
    :ContentsManager.pre\u save\u hookabd
    FileContentsManager.post\u save\u hook
    。您可以添加一个post save hook
    jupyter nbconvert--to script[notebook]
    是否有方法实现相反的操作,即从python脚本转换到笔记本。例如,拥有一些解析为单元格的专用文档字符串?将文件夹中的所有笔记本转换为script/path/to/notebooks/*。ipynb谢谢,它可以工作!,但是,如果我不想在[]中输入
    。:
    在脚本中键入内容,我希望它是干净的。“有什么办法可以做到这一点吗?”RishabhAgrahari似乎对我很有用<代码>!jupyter nbconvert--到脚本--没有提示notebook.ipynb如果您不想安装任何jupyter工具,最好的答案。我喜欢这个。但当我从Jupyter笔记本下载.py格式时,我发现它使用UNIX行结尾,即使我使用的是w
    import nbformat as nbf
    from nbconvert.exporters import PythonExporter
    from nbconvert.preprocessors import TagRemovePreprocessor
    
    with open("a_notebook.ipynb", 'r', encoding='utf-8') as f:
        the_notebook_nodes = nbf.read(f, as_version = 4)
    
    trp = TagRemovePreprocessor()
    
    trp.remove_cell_tags = ("remove",)
    
    pexp = PythonExporter()
    
    pexp.register_preprocessor(trp, enabled= True)
    
    the_python_script, meta = pexp.from_notebook_node(the_notebook_nodes)
    
    with open("a_python_script.py", 'w', encoding='utf-8') as f:
        f.writelines(the_python_script)
    
    sudo apt-get install jupyter-nbconvert