我正在使用 Jupyter Notebooks 为学生布置作业。我的目标是生成同一 Notebook 的不同版本,以分发给导师和学生。
我需要某些单元格(例如包含练习解决方案的单元格)仅包含在导师版本中,而其他单元格则应专属于学生版本。有时,我想删除整个单元格,有时,只想删除输出。
我相信这可以通过标记单元格并使用nbconvert
将笔记本(.ipynb
)保存到另一个.ipynb
文件来实现。
这里建议使用类似的方法转换.ipynb
为 HTML 。我很想知道是否有人有经验或有创意的新想法,可以为不同的受众创建单个 Jupyter Notebook 的不同版本。
我的项目相当庞大,所以我需要一个自动化的解决方案。虽然如果我只有几个笔记本,我可以通过复制和粘贴手动创建不同的版本,但这种方法对于更大规模的项目来说是不可行的。
根据最初的评论,我尝试将标签分配"remove_cell"
给某些笔记本单元(此处的示例笔记本),然后使用此答案的建议将其删除
jupyter nbconvert nbconvert-example.ipynb --TagRemovePreprocessor.remove_cell_tags='{"remove_cell"}'
但是,使用该选项保存到 Jupyter Notebook 时,不会删除标记的单元格--to notebook
。只有使用该选项时才会删除它们--to html
。
如果您习惯使用 Python 编程,则
nbformat
可以使用基于标签和/或单元格内容的各种功能。它包含了笔记本、单元格类型等概念。因此,它非常适合迭代笔记本和内容并进行操作以生成新版本的笔记本。在这里,我使用它来修复笔记本中要以幻灯片形式运行的单元格的元数据。调整它和此示例以编辑 markdown 单元格以查看
remove_cell
标签并将其删除,将如下所示:然后,由于您使用的是 nbformat,您还可以在脚本中包含删除任何您已标记为删除的输出。
(如果您想删除学生版本的所有输出,请参阅我对“打开 Jupyter 笔记本而不渲染图像也不填充 [sic] 数据框 - 安全模式加载防止内存不足状态”的回答。)
如果您想执行笔记本,您可以在命令行上使用 nbconvert(如 Dunes 的接受答案中所示)或通过脚本(如“使用 nbconvert 作为库”中所示)执行。我喜欢将Jupytext作为工具箱中的工具。Jupytext 很方便,我可以使用 nbformat 来完成大部分繁重的工作,而无需执行。
您会在“使用 nbconvert 作为库”中注意到nbformat 经常与 nbformat 结合使用。
如果您想要更多有关 nbformat 的示例,我有很多带有代码的示例,您可以在这里和这里查看。
这些都内置于 nbconvert 中。您只需执行以下操作:
我不建议使用
TagRemovePreprocessor.remove_input_tags
,因为源保存在文件中,但 GUI 被告知不要显示它。对于任何您想向学生展示输出应该是什么样子,但不展示如何生成输出的单元格,我建议您编写自己的预处理器,该预处理器接收单元格,剥离输入,并将单元格转换为 markdown 单元格,复制到输出中。这样,当学生运行笔记本时,“输出”就会保留下来。
您可以在此处找到有关如何添加和运行自己的预处理器的更多信息: https: //nbconvert.readthedocs.io/en/latest/nbconvert_library.html#Custom-Preprocessors