繁体   English   中英

Jupyter Notebook nbconvert 无魔法命令/无降价

[英]Jupyter Notebook nbconvert without magic commands/ w/o markdown

我有一个Jupyter笔记本,我想将它转换成一个Python使用脚本nbconvert命令,从Jupyter笔记本。

我在笔记本的末尾包含了以下行:

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

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

  1. 没有输入语句,例如:

    #在[27]中:

  2. 没有降价,包括以下声明:

    # 编码:utf-8

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

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

    目前, %magic命令被转换为以下形式: get_ipython().magic(...) ,但这些在Python不一定能识别。

控制输出中出现的内容的一种方法是标记输出中不需要的单元格,然后使用 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]),我相信您需要在您调用 !jupyter nbconvert 的单元格之后的单元格中使用以下内容对 Python 文件进行后处理(注意这是 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 使用新的模板结构使这更容易一些。

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

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

解决方案涵盖了添加模板的所有细节。

这个模板将删除所有的 markdown、magic 和 cell 数字,留下一个“可运行”的 .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类的东西来使其工作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM