ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Jupytext 实战:将含文本、HTML、图片与错误输出的 Notebook 转换为 MyST Markdown

Jupytext 实战:将含文本、HTML、图片与错误输出的 Notebook 转换为 MyST Markdown 开发工具【免费下载链接】jupytextJupyter Notebooks as Markdown Documents, Julia, Python or R scripts项目地址https://gitcode.com/gh_mirrors/ju/jupytext点击查看免费下载本文以 Jupytext 仓库中的真实转换产物 text_outputs_and_images.md 为核心讲解一个包含文本、HTML、图片与错误异常四类输出的 Jupyter Notebook 是如何被转换为 MySTMyST Markdown文本格式的。你将掌握 Jupytext 的 MyST 格式语法YAML 前置元数据、块分隔、{code-cell}指令、三种转换路径CLI、Python API、Contents Manager以及 MyST 文本表示对“执行输出”的处理边界可直接用于自己项目的 ipynb ↔ MyST 双写与版本管理。一、文档背景一次带输出的转换实验仓库中的示例源自一个刻意混合多种输出类型的测试 Notebooktext_outputs_and_images.ipynb。它在七个单元格中依次演示了print/sys.stdout/sys.stderr三类文本输出logging模块的四种日志级别pandas DataFrame 的 HTML 纯文本双表示execute_resultIPython.display.display的连续多次展示display_datamatplotlib 内联绘图image/png二进制输出未定义变量引发的NameError异常与 traceback。该 Notebook 经 Jupytext 转换为 MyST 格式后得到的就是本文所围绕的 text_outputs_and_images.md。它同时是ipynb_to_myst镜像测试目录中的标准产物用于验证“Notebook → MyST → Notebook”往返转换的一致性见 tests/functional/round_trip/test_mirror.py 中的test_ipynb_to_myst。二、MyST 文本表示的总体结构转换后的.md文件保留了 Notebook 的全部源代码内容与单元格结构整体布局如下--- kernelspec: display_name: Python 3 language: python name: python3 --- This notebook contains outputs of many different types: text, HTML, plots and errors. # Text outputs Using print, sys.stdout and sys.stderr {code-cell} ipython3 import sys print(using print) sys.stdout.write(using sys.stdout.write) sys.stderr.write(using sys.stderr.write)可以看到MyST 表示由三部分组成 - **文件头 YAML 前置元数据front matter**以 --- 包围保存了原 Notebook 的顶层元数据。示例中保留了 kernelspecPython 3 内核这部分正是 Jupytext 用于识别文件格式与内核的关键标记 - **Markdown 单元格**以 MyST block break分隔普通文本直接写入 - **代码单元格**以 {code-cell} ipython3 围栏指令fence directive包裹指令名后跟随语言/词法器标识。 这一结构与 [src/jupytext/myst.py](https://link.gitcode.com/i/551490cfdefa668a6c6750da685b91ba) 中 notebook_to_myst() 的生成逻辑完全对应Notebook 元数据经 dump_yaml_blocks() 以 YAML 块写出Markdown 单元格之间插入 代码与原始单元格则用 {code-cell} / {raw-cell} 围栏包裹见 [src/jupytext/myst.py](https://link.gitcode.com/i/551490cfdefa668a6c6750da685b91ba#L353-L422)。 ### 词法器lexer参数的来源 注意围栏指令写成 {code-cell} ipython3 而不是 {code-cell}。依据源码 [notebook_to_myst](https://link.gitcode.com/i/551490cfdefa668a6c6750da685b91ba#L372-L401)Jupytext 会优先读取 nb.metadata.language_info.pygments_lexer 的值本例为 ipython3作为指令参数供 MyST 渲染器做语法高亮测试 [test_ipynb_to_myst.py](https://link.gitcode.com/i/edf2cb3ee8798e5788f627d8284e7d52) 也验证了这一点当 language_info 元数据存在 pygments_lexer: ipython3 时所有代码单元格会带 ipython3 词法器缺失时则为裸的 {code-cell}。 ## 三、三种等价的转换路径 同一个 Notebook 可以通过三条路径得到完全相同的 MyST 文本测试 [test_myst_representation_same_cli_or_contents_manager](https://link.gitcode.com/i/afeb1e5692be8ed7e91ab823805d1a13) 用 compare() 断言了三者输出一致 ### 1. 命令行CLI bash jupytext --to md:myst notebook.ipynb--to md:myst指定目标格式为 MyST Markdown格式名myst。转换产物默认与源文件同名、扩展名改为.md例如text_outputs_and_images.ipynb→text_outputs_and_images.md。2. Python APIimport jupytext nb jupytext.read(notebook.ipynb) # 读取 Notebook text jupytext.writes(nb, fmtmd:myst) # 写出为 MyST 文本3. Jupyter 内核的 Contents Manager配对格式在 Jupyter 配置中声明配对格式保存 ipynb 时自动同步生成 MyST 文件c.ContentsManager.formats ipynb,md:myst # 或通过 jupytext.toml / jupytext.yml 配置Jupytext 的 Contents Manager 会在保存notebook.ipynb的同时把同名的notebook.mdMyST 格式一起写入磁盘实现“一次保存、双份同步”这正是 MyST 文本表示用于版本管理的核心场景。仓库中的 jupyterlab/jupyter-config/jupyter_notebook_config.d/jupytext.json 展示了在 Jupyter 中启用 Jupytext 的配置方式。四、逐类解析四类输出在 MyST 中的呈现1. 文本输出print / stdout / stderr / logging# Text outputs Using print, sys.stdout and sys.stderr {code-cell} ipython3 import sys print(using print) sys.stdout.write(using sys.stdout.write) sys.stderr.write(using sys.stderr.write)import logging logging.debug(Debug) logging.info(Info) logging.warning(Warning) logging.error(Error)两个单元格分别演示了标准输出通道print、sys.stdout.write与标准错误通道sys.stderr.write以及 logging 四种级别的日志调用。在 MyST 文本中它们都以普通代码单元格的形式完整保留源码用于说明“任意输出类型的代码单元都能被无差别地序列化”。 ### 2. HTML 输出pandas 的双重 MIME 表示 markdown # HTML outputs Using pandas. Here we find two representations: both text and HTML. {code-cell} ipython3 import pandas as pd pd.DataFrame([4])from IPython.display import display display(pd.DataFrame([5])) display(pd.DataFrame([6]))对应原 Notebook[text_outputs_and_images.ipynb](https://link.gitcode.com/i/acfcaa429f948193e05f0b1d07cf8eda#L53-L198)中的两个单元格第一个产生 execute_result 输出带 text/html 与 text/plain 两种 MIME 表示第二个通过 display() 连续产生两次 display_data 输出。文本表示只关心代码本身而 HTML/纯文本两种表示在转换中都被忽略详见下文“输出的去留”。 ### 3. 图片输出matplotlib 内联绘图 markdown # Images {code-cell} ipython3 %matplotlib inline# First plot from matplotlib import pyplot as plt import numpy as np w, h 3, 3 data np.zeros((h, w, 3), dtypenp.uint8) data[0,:] [0,255,0] data[1,:] [0,255,0] data[2,:] [0,255,0] data[1:3,1:3] [255, 0, 0] plt.imshow(data) plt.axis(off) plt.show() # Second plot data[1:3,1:3] [255, 255, 0] plt.imshow(data) plt.axis(off) plt.show()%matplotlib inline使绘图输出以image/png形式内联显示两个绘图单元格在源 Notebook 中带有image/pngtext/plain双 MIME 输出见 text_outputs_and_images.ipynb。转换为 MyST 后绘图代码被完整保留二进制 PNG 数据则不写入文本文件。4. 错误输出NameError 与 traceback# Errors {code-cell} ipython3 undefined_variable源单元格执行后产生了完整的 NameError 异常与 ANSI 着色 traceback见 [text_outputs_and_images.ipynb](https://link.gitcode.com/i/acfcaa429f948193e05f0b1d07cf8eda#L273-L292)。异常输出同样属于“输出”范畴在 MyST 文本中被丢弃仅保留触发异常的代码本身。 ## 五、关键事实执行输出outputs在 MyST 文本中的去留 这是使用 MyST 格式前必须明确的边界**Jupytext 的 MyST 文本表示只保存单元格源码与元数据不保存任何执行输出outputs**。证据如下 - 转换产物 [text_outputs_and_images.md](https://link.gitcode.com/i/df970b6c132b11fcc773fe1aeae6844e) 通篇没有任何 text/plain、text/html、image/png 或 error 输出块 - 源码层面[notebook_to_myst](https://link.gitcode.com/i/551490cfdefa668a6c6750da685b91ba#L353-L422) 遍历 nb.cells 时只写出 cell.source 与 cell.metadata从不读取 cell.outputs - 反向解析时[myst_to_notebook](https://link.gitcode.com/i/551490cfdefa668a6c6750da685b91ba#L244-L350) 从 MyST 文本构建的代码单元格同样不带 outputs。 这也解释了 MyST 格式的定位它是**面向版本管理与协作**的文本表示主张“代码入库、输出不入库”。因此 - 想在 Git 中保留执行结果的应使用 ipynb 配对ipynb,md:myst双写方案让输出留在 ipynb 中 - 只关心源代码与文档内容的团队可直接把 .mdMyST作为唯一版本控制对象需要查看结果时再重新执行。 ## 六、反向流程MyST 如何解析回 Notebook 将 MyST 文本还原为 Notebook 由 myst_to_notebook() 完成其解析策略见 [src/jupytext/myst.py](https://link.gitcode.com/i/551490cfdefa668a6c6750da685b91ba#L244-L350)与本文示例文件的结构一一对应 1. **front matter**读取文件头 --- 之间的 YAML作为 Notebook 顶层元数据本示例即 kernelspec 2. **{code-cell} 围栏**围栏内内容成为代码单元格源码指令名后的词法器用于在缺失 language_info 时补写 default_lexer 元数据 3. ** 块分隔**相邻 Markdown 文本按块切分为独立 Markdown 单元格 4. **嵌套保护**解析器通过 nesting_level 跳过嵌套在列表等结构中的围栏块仅识别顶层单元格[src/jupytext/myst.py](https://link.gitcode.com/i/551490cfdefa668a6c6750da685b91ba#L299-L305) 5. **可选 source_map**传入 add_source_mapTrue 时会在 Notebook 元数据中记录每个单元格的起始行号测试 [test_add_source_map](https://link.gitcode.com/i/2f7526746b8ac2392ae35938c4dbf91a) 验证了该行为。 文件格式识别则由 matches_mystnb() 完成[src/jupytext/myst.py](https://link.gitcode.com/i/551490cfdefa668a6c6750da685b91ba#L70-L123)扩展名为 .myst / .mystnb / .mnb 直接判定.md 扩展名则需结合 front matter 中的 format_name: myst 或 {code-cell} 围栏进一步确认——这也是为什么本文示例文件保留了 kernelspec 头块。 ## 七、把该示例用起来验证往返转换 你可以用仓库中的测试体系亲手验证“输出不保留、源码完整保留”的行为 bash # 用仓库测试框架运行镜像往返测试覆盖全部输入 Notebook pytest tests/functional/round_trip/test_mirror.py::test_ipynb_to_myst # 验证 CLI、Python API、Contents Manager 三种方式生成同一 MyST 文本 pytest tests/functional/simple_notebooks/test_ipynb_to_myst.py -k representation_sameipynb_to_myst镜像目录tests/data/notebooks/outputs/ipynb_to_myst/中存放了包括本文示例在内的全部基准产物可作为你手工转换结果的比对基准tests/conftest.py中的ipynb_to_mystfixturetests/conftest.py则遍历所有输入 Notebook 驱动这些测试。八、适用场景与注意事项适合用 Markdown 写文档型 Notebook、团队 Git 协作、代码审查、与 MyST如 Jupyter Book、Sphinx MyST-Parser文档工具链打通注意MyST 文本不携带 outputs因此不适合需要长期保留绘图、表格或错误现场的场景此类需求请改用ipynb双写配对或纯 ipynb 版本管理依赖MyST 格式的读写依赖markdown-it-py及其 MyST 插件src/jupytext/myst.py未安装时 Jupytext 会抛出明确的ImportError提示test_ipynb_to_myst.py 覆盖了 CLI 与 Contents Manager 两条路径的错误处理格式标识为便于后续工具识别建议保留文件头的kernelspec元数据并在转换时统一使用md:myst格式名。赞分享开发工具【免费下载链接】jupytextJupyter Notebooks as Markdown Documents, Julia, Python or R scripts项目地址https://gitcode.com/gh_mirrors/ju/jupytext点击查看免费下载相关推荐Jupytext 实战将含 Plotly 交互图表的 Notebook 转换为 MyST Markdown 轻量文档Jupytext 实战将含 Plotly 交互图表的 Notebook 转换为 MyST Markdown 轻量文档 本指南以 Jupytext 仓库中的真实开发工具Jupytext Markdown 格式实战将含文本、HTML、图像与错误输出的 Jupyter 笔记本无损转为 Markdown 文档Jupytext Markdown 格式实战将含文本、HTML、图像与错误输出的 Jupyter 笔记本无损转为 Markdown 文档 本指南围绕 Jupy开发工具pandas v0.16.1 版本解析CategoricalIndex、sample 抽样与字符串访问器的里程碑式增强pandas v0.16.1 版本解析CategoricalIndex、sample 抽样与字符串访问器的里程碑式增强 pandas v0.16.12015开发工具上一篇跨架构兼容技术突破Box64实现ARM设备高效运行x86_64程序的完整解决方案下一篇如何在5分钟内免费将地理数据转换为3D地形模型BlenderGIS完整指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表