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

问题描述 投票:169回答:8

我正在考虑使用* .ipynb文件作为事实的来源,并以编程方式将它们“编译”成.py文件以用于预定的作业/任务。

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

ipython ipython-notebook
8个回答
306
投票

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

在命令行中,您可以使用nbconvert

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

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

!jupyter nbconvert --to script config_template.ipynb

--to scriptadded之前,选项是--to python--to=python,但是在向语言无关的笔记本系统的转变中是renamed


36
投票

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

jupyter nbconvert --to script *.ipynb

13
投票

这是一种快速而肮脏的方法,可以在不使用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()

12
投票

按照前面的示例,但使用新的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'))

6
投票

@ Spawnrider的最后一行代码,

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

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

fh.writelines(source) 

虽然工作。


5
投票

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

3
投票

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

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

0
投票

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

所以最终我写了my own solution

import io
import os
import re
from nbconvert.exporters.script import ScriptExporter
from notebook.utils import to_api_path


def script_post_save(model, os_path, contents_manager, **kwargs):
    """Save a copy of notebook to the corresponding language source script.

    For example, when you save a `foo.ipynb` file, a corresponding `foo.py`
    python script will also be saved in the same directory.

    However, existing config files I found online (including the one written in
    the official documentation), will also create an `Untitile.txt` file when
    you create a new notebook, even if you have not pressed the "save" button.
    This is annoying because we usually will rename the notebook with a more
    meaningful name later, and now we have to rename the generated script file,
    too!

    Therefore we make a change here to filter out the newly created notebooks
    by checking their names. For a notebook which has not been given a name,
    i.e., its name is `Untitled.*`, the corresponding source script will not be
    saved. Note that the behavior also applies even if you manually save an
    "Untitled" notebook. The rationale is that we usually do not want to save
    scripts with the useless "Untitled" names.
    """
    # only process for notebooks
    if model["type"] != "notebook":
        return

    script_exporter = ScriptExporter(parent=contents_manager)
    base, __ = os.path.splitext(os_path)

    # do nothing if the notebook name ends with `Untitled[0-9]*`
    regex = re.compile(r"Untitled[0-9]*$")
    if regex.search(base):
        return

    script, resources = script_exporter.from_filename(os_path)
    script_fname = base + resources.get('output_extension', '.txt')

    log = contents_manager.log
    log.info("Saving script at /%s",
             to_api_path(script_fname, contents_manager.root_dir))

    with io.open(script_fname, "w", encoding="utf-8") as f:
        f.write(script)

c.FileContentsManager.post_save_hook = script_post_save

要使用此脚本,您可以将其添加到~/.jupyter/jupyter_notebook_config.py :)

请注意,您可能需要重新启动jupyter notebook / lab才能使其正常工作。

© www.soinside.com 2019 - 2024. All rights reserved.