[英]Execute a Jupyter notebook including inline markdown with nbconvert
[英]Jupyter Notebook nbconvert without magic commands/ w/o markdown
我有一个Jupyter
笔记本,我想将它转换成一个Python
使用脚本nbconvert
命令,从内Jupyter
笔记本。
我在笔记本的末尾包含了以下行:
!jupyter nbconvert --to script <filename>.ipynb
这将创建一个Python
脚本。 但是,我希望生成的.py
文件具有以下属性:
#在[27]中:
# 编码:utf-8
忽略%magic
命令,例如:
%matplotlib inline
!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.