Jupyter Notebook nbconvert 没有魔法命令/ w/o markdown

Jupyter Notebook nbconvert without magic commands/ w/o markdown

我有一个 Jupyter 笔记本,我想使用 中的 nbconvert 命令将其转换为 Python 脚本Jupyter 笔记本。

我在笔记本末尾添加了以下行:

!jupyter nbconvert --to script <filename>.ipynb

这将创建一个 Python 脚本。但是,我希望生成的 .py 文件具有以下属性:

  1. 没有输入语句,如:

    # In[27]:

  2. 无降价,包括如下语句:

    # coding: utf-8

  3. 忽略%magic命令,例如:

    1. %matplotlib inline
    2. !jupyter nbconvert --to script <filename>.ipynb,即笔记本中执行Python转换
    3. 的命令

    目前,%magic 命令被翻译成以下形式:get_ipython().magic(...),但这些在 Python.

  4. 中不一定被识别

控制输出中显示的内容的一种方法是标记输出中不需要的单元格,然后使用 TagRemovePreprocessor 删除单元格。

下面的代码还使用了 TemplateExporter 中的 exclude_markdown 函数来删除 markdown。

!jupyter nbconvert \
    --TagRemovePreprocessor.enabled=True \
    --TagRemovePreprocessor.remove_cell_tags="['parameters']" \
    --TemplateExporter.exclude_markdown=True \
    --to python "notebook_with_parameters_removed.ipynb"

要删除注释行和输入语句市场(如 # [1]),我相信您需要 post-使用类似于以下内容的内容处理 Python 文件您调用 !jupyter nbconvert 的单元格之后的单元格(请注意,这是 Python 3 代码):

import re
from pathlib import Path
filename = Path.cwd() / 'notebook_with_parameters_removed.py'
code_text = filename.read_text().split('\n')
lines = [line for line in code_text if len(line) == 0 or 
        (line[0] != '#' and 'get_ipython()' not in line)]
clean_code = '\n'.join(lines)
clean_code = re.sub(r'\n{2,}', '\n\n', clean_code)
filename.write_text(clean_code.strip())

Jupyter nbconvert 使用新的 template structure.

让这件事变得更容易一些

模板应放在模板路径中。这个可以通过运行jupyter --paths

找到

每个模板都应放在模板目录中自己的目录中,并且必须包含 conf.json 和 index.py.j2 文件。

涵盖了添加模板的所有详细信息。

此模板将删除所有降价、魔术和单元格数字,留下“可运行”的 .py 文件。 运行 此模板来自笔记本 !jupyter nbconvert --to python --template my_clean_python_template my_notebook.ipynb

index.py.j2

{%- extends 'null.j2' -%}

## set to python3
{%- block header -%}
#!/usr/bin/env python3
# coding: utf-8
{% endblock header %}

## remove cell counts entirely
{% block in_prompt %}
{% if resources.global_content_filter.include_input_prompt -%}
{% endif %}
{% endblock in_prompt %}

## remove markdown cells entirely
{% block markdowncell %}
{% endblock markdowncell %}

{% block input %}
{{ cell.source | ipython2python }}
{% endblock input %}


## remove magic statement completely
{% block codecell %}
{{'' if "get_ipython" in super() else super() }}
{% endblock codecell%}

最明显的解决方案似乎对我有用:

 jupyter nbconvert --to python a_notebook.ipynb --stdout | grep -v -e "^get_ipython" | python

当然,您不能在笔记本中使用类似 dirs = !ls 的东西来实现此功能。