如何扩展nbconvert Markdown模板:隐藏代码块保留代码输出
解决nbconvert隐藏代码块但保留输出的问题
我之前也碰到过类似的坑,nbconvert的文档确实对Jinja2新手不太友好。下面给你两种解决方案,分别对应全局隐藏所有代码和按单元格元数据选择性隐藏的场景:
方案1:全局隐藏所有代码,只保留输出
创建一个名为my_template.tpl的模板文件,内容如下:
{% extends 'markdown.tpl' %} # 完全覆盖代码单元格的输入渲染逻辑,不输出任何代码 {% block codecell %} {% endblock codecell %}
这个模板继承了官方默认的Markdown模板,只修改了codecell块——把原本渲染代码的逻辑清空,这样所有代码块的输入都会被隐藏,但输出会按照默认规则正常渲染。
使用命令:
jupyter nbconvert --to markdown --template my_template.tpl my_notebook.ipynb
对你的示例代码来说,输出就会是你想要的:
# Title This is text `this is code`
方案2:按单元格元数据选择性隐藏代码
如果你只想隐藏带有hide_input: true元数据的单元格代码,其他单元格正常显示,可以用这个模板:
{% extends 'markdown.tpl' %} {% block codecell %} {% if not cell.metadata.get('hide_input', False) %} ```python {{ cell.source }} ``` {% endif %} {% endblock codecell %}
这样只有当单元格的元数据里包含{"hide_input": true}时,代码才会被隐藏,其他单元格的代码和输出都会正常显示。
为什么你之前的模板没生效?
你之前的写法有两个问题:
- 没有继承默认模板:直接写
{% block data_codecell %}但没继承markdown.tpl,导致模板上下文缺失,输出逻辑没被触发; - 输出处理不完整:只针对
text/markdown类型的输出做了处理,没有遍历所有输出,也没覆盖其他输出类型(比如文本、图片等)的渲染逻辑。
关于nbconvert模板的小提示
- 你可以用
jupyter nbconvert --show-config查看默认模板的存储路径,直接打开官方的markdown.tpl文件,就能看到所有可覆盖的块结构,比官方文档直观多了; - 每个输出类型(比如
execute_result、display_data、stream)都有对应的Jinja块,如果你需要自定义某类输出的渲染方式,可以单独覆盖对应的块。
内容的提问来源于stack exchange,提问作者Aaron Ciuffo
相关产品推荐
相关产品推荐

