ARTICLE DETAIL

资讯详情

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

Jupytext 文本笔记本格式全解:percent、light、marimo、nomarker 与 Sphinx 脚本格式实战指南

Jupytext 文本笔记本格式全解:percent、light、marimo、nomarker 与 Sphinx 脚本格式实战指南 开发工具【免费下载链接】jupytextJupyter Notebooks as Markdown Documents, Julia, Python or R scripts项目地址https://gitcode.com/gh_mirrors/ju/jupytext点击查看免费下载Jupytext 的核心能力之一是将 Jupyter 笔记本.ipynb与各种以代码为中心的文本格式互相转换。其中percent、light、nomarker、marimo与sphinx五种脚本格式即文档 website/src/content/docs/formats/scripts.md 所讲解的内容分别面向不同的编辑器生态与使用场景。读完本文你将掌握每种格式的单元格语法、单元格元数据写法、命令行转换与配置方式并能结合仓库源码理解 Jupytext 判定格式的底层机制从而为自己的项目选择最合适的文本笔记本格式。一、percent格式以# %%显式划分单元格percent格式是 Jupyter 笔记本的脚本化表示所有单元格都用带注释的双百分号# %%显式分隔。该格式目前可用于多种语言完整语言列表见 src/jupytext/languages.py 中的_SCRIPT_EXTENSIONS映射表。1.1 格式起源与编辑器生态percent格式由 Spyder 于 2013 年引入如今已被大量主流编辑器与 IDE 原生支持包括Spyder IDE以其代码单元格功能支持HydrogenAtom 编辑器下通过 Jupyter 内核执行代码的插件其笔记本导出即percent格式VS CodePython 插件的 Jupyter 代码单元格功能Python Tools for Visual StudioPTVSPyCharm Professional。正因为这个生态基础percent格式成为在普通编辑器里写笔记本最常用的选择文件本身就是合法的 Python/R/Julia 脚本任何编辑器都能打开而支持单元格的编辑器还能按# %%逐块执行。1.2 单元格语法标题、类型与元数据Jupytext 对percent格式的实现约定如下单元格可以携带标题、单元格类型markdown、md或raw代码单元格省略类型以及单元格元数据全部写在# %%所在行# %% Optional title [cell type] keyvalue一个同时包含 Markdown 单元格与代码单元格的完整示例# %% [markdown] # This is a multiline # Markdown cell # %% [markdown] # Another Markdown cell # %% # This is a code cell class A(): def one(): return 1 def two(): return 2注意代码单元格内# This is a code cell这一行注释会被当作单元格内容的一部分原样保留它是代码单元格内的注释而非 Markdown 文本。1.3 Python 脚本中的多行注释 Markdown 单元格对于 Python 脚本Markdown 单元格还可以使用**多行注释三引号字符串**来书写便于容纳大段文本# %% [markdown] This is a Markdown cell that uses multiline comments 默认情况下Jupytext 将笔记本转换为percent脚本时使用行注释#表示文本单元格。如果你希望所有文本单元格都用多行注释表示可以在笔记本元数据中设置{jupytext: {cell_markers: \\\}}两种途径任选其一在 Jupyter 的笔记本元数据编辑器中直接添加或使用命令行jupytext --update-metadata {jupytext: {cell_markers: \\\}} notebook.ipynb --to py:percent若希望所有配对笔记本全局生效则把如下配置写入jupytext.toml配置文件cell_markers 1.4 源码佐证与真实示例在 src/jupytext/formats.py 中percent格式为每一种脚本扩展名注册了DoublePercentScriptCellReader与DoublePercentCellExporter作为读写实现并标注了格式版本v1.1 引入[markdown]/[raw]类型标记v1.2 起 Jupyter magic 默认被注释v1.3 起支持三引号 Markdown 单元格并以keyvalue表示元数据。仓库示例 demo/World population.pct.py 展示了World population.ipynb笔记本在percent格式下的完整形态文件头是 YAML 格式的jupyter:元数据块正文以# %% [markdown]和# %%交替组织。二、marimo格式与 Marimo 的双向互转自 Jupytext v1.19 起新增了py:marimo格式文本笔记本通过 Marimo 转换为 Jupyter 笔记本反之亦然。2.1 实现原理与版本要求从源码 src/jupytext/marimo.py 可以确认其实现方式Jupytext 直接调用 Marimo 的转换器完成双向转换——笔记本 → Marimo 脚本调用marimo convert ipynb -o py见notebook_to_marimo_pyMarimo 脚本 → 笔记本调用marimo export ipynb --sort top-down py -o ipynb见marimo_py_to_notebook--sort top-down用于保持单元格顺序、最小化往返差异。这要求环境中已安装Marimo 0.16.3 或更高版本源码中硬编码了MARIMO_MIN_VERSION 0.16.3低于该版本或未安装时会抛出MarimoError。转换通过临时文件完成转换完成后 Jupytext 还会做一些后处理以保证往返稳定性例如还原%matplotlib inline、删除自动注入的import marimo as mo单元、把# Cell tags:注释行还原为单元格 tags 元数据。2.2 使用marimo格式的注意事项该格式仅适用于 Python 笔记本Marimo 会对多次定义的变量添加后缀以适配其响应式求值机制笔记本元数据与单元格元数据tags 除外无法存储在py:marimo文件中截至 Marimo 0.17.8空单元格在往返转换过程中会被移除。2.3 用--test验证往返稳定性你可以用--test命令快速检查某个文档在 Marimo 往返转换后是否保持稳定jupytext --test --to py:marimo your_notebook.ipynb jupytext --test --to ipynb your_marimo_script.py相关测试用例可见 tests/unit/test_landing_page_notebook.py其中py:marimo格式会先检查 Marimo 是否可用再执行往返测试--test的通用行为在 tests/functional/cli/test_cli.py 中有大量覆盖。若--test报出意外差异且能用marimo convert与marimo export ipynb --sort top-down复现则该问题应反馈给 Marimo 项目若问题出在 Jupytext 侧则反馈给 Jupytext 项目。三、light格式Jupytext 原创的最少标记格式light格式由 Jupytext 首创可以把任意脚本语言文件见 src/jupytext/languages.py 支持的语言列表表示为 Jupyter 笔记本。3.1 转换规则段落与空行将light脚本转换为笔记本时Jupytext 的规则是代码段落→ 代码单元格不与代码相邻的注释→ Markdown 单元格单元格在函数、类或多行注释之外的空白行处断开。例如下面的脚本包含三个单元格# This is a multiline # Markdown cell # Another Markdown cell # This is a code cell class A(): def one(): return 1 def two(): return 2注意前两个 Markdown 单元格之间只有一个空行因此它们被识别为两个相邻的 Markdown 单元格而class A与def two之间的空行处于类内部不会导致单元格拆分。3.2 显式单元格标记# 与# -当代码单元格包含多个代码段落时Jupytext 使用显式的单元格起始标记来明确边界默认起始标记为# 在 C 等语言中是// 默认结束标记为# -。结束标记在紧接另一个起始标记或文件结尾时可以省略# # A single code cell made of two paragraphs a 1 def f(x): return xa上面的脚本中a 1与def f(x)之间有空行但因为有# 标记它们被合并为同一个代码单元格源码层面由LightScriptCellReader解析见 src/jupytext/formats.py。3.3 单元格元数据keyvalue表示法light格式用keyvalue的键值表示法为单元格附加元数据# keyvalue # A code cell with metadata # [markdown] keyvalue # A Markdown cell with metadata3.4 自定义单元格标记VS Code/PyCharm 与 Vim 折叠标记light格式支持用自定义标记替换默认的# /# -若偏好 VS Code/PyCharm 的 region 折叠标记设置cell_markers: region,endregion若偏好 Vim 折叠标记设置cell_markers: {{{,}}}。可以在笔记本元数据的 jupytext 段中设置按笔记本生效也可以在jupytext.toml配置文件中设为全局默认cell_markers region,endregion # Use VS Code/PyCharm region folding delimiters或cell_markers {{{,}}} # Use Vim region folding delimiters这一配置项在 src/jupytext/config.py 中有完整定义与帮助文本tests/integration/contents_manager/test_contentsmanager.py 中多次使用cm.cell_markers region,endregion验证该配置对读写行为的影响。仓库示例 demo/World population.lgt.py 展示了同一笔记本在light格式下的形态——其文件头元数据里即带有cell_markers: region,endregion正文用# region/# endregion包住代码单元格普通注释段落则直接作为 Markdown 单元格。四、nomarker格式完全无标记的变体nomarker是light格式的一个变体不带任何单元格标记。代价是它不提供往返一致性代码单元格会按代码段落被拆分。在 src/jupytext/formats.py 中nomarker复用LightScriptCellReader读取但导出器换成了BareScriptCellExporter二者行为差异正体现在是否写入单元格标记上。默认情况下nomarker格式仍然包含 YAML 头笔记本元数据。如果你希望连头也去掉可在笔记本元数据的 jupytext 段中设置{jupytext: {notebook_metadata_filter: -all}}值得注意的是nomarker与其他几个不存储单元格元数据的格式sphinx、spin、quarto、marimo一起被记录在FORMATS_WITH_NO_CELL_METADATA集合中见 src/jupytext/formats.py。五、Sphinx-Gallery 脚本reStructuredText 注释格式Sphinx-Gallery 是 Python 生态中另一种流行的类笔记本脚本格式常用于生成文档示例库。Jupytext 支持读写这种格式格式名为sphinx扩展名为.py。5.1 识别规则与 rst2md 转换识别规则包含至少两行、每行超过二十个井号#注释分隔线的脚本会被 Jupytext 自动归类为 Sphinx-Gallery 笔记本。示例可见 demo/World population.spx.py其中用###############################################################################分隔各段落。Sphinx-Gallery 脚本中的注释使用reStructuredTextrst而非 Markdown 书写。为了让它们在 Jupyter 中有更美观的 Markdown 显示可以在 Jupytext 配置文件中加入sphinx_convert_rst2md True请注意这是一个不可逆的转换——rst 被转成 Markdown 后无法还原。因此该选项只建议与 Binder 等只读展示场景配合使用当你用 Jupytext 编辑 Sphinx-Gallery 文件时应恢复默认值sphinx_convert_rst2md False。该配置项在 src/jupytext/config.py 中有定义读取时才会生效见set_default_format_options中if read and self.sphinx_convert_rst2md的分支并有对应测试 tests/external/rst2md/test_rst2md.py。5.2 用 Binder 把 Sphinx-Gallery 仓库变成可运行笔记本把一个包含 Sphinx-Gallery 脚本的 GitHub 仓库变成可交互运行笔记本的仓库只需在该仓库添加两个文件binder/requirements.txt——列出所需包其中必须包含jupytextjupytext.toml配置文件内容如下preferred_jupytext_formats_read py:sphinx sphinx_convert_rst2md true其中preferred_jupytext_formats_read py:sphinx表示当 Jupytext 读取*.py脚本时一律按 Sphinx-Gallery 格式解析该配置项定义见 src/jupytext/config.py帮助文本中即给出py:sphinx的示例。六、格式选型速查与语言支持范围综合本文讨论的五种格式可按下表快速选型格式标记方式往返一致性适用场景percent# %%显式强格式自描述多编辑器生态Spyder、VS Code、PyCharm、Hydrogen、PTVS团队协作首选marimoMarimo 原生结构依赖 Marimo 版本深度使用 Marimo 反应式笔记本的 Python 项目light# /# -可自定义强可显式标记追求最少标记、希望脚本读起来像普通代码的场景nomarker无弱代码单元格按段落拆分脚本本身就是目标产物、无需严格往返的场景sphinxrst 注释 长井号分隔线依赖 rst2md 选项Sphinx 文档示例库、与 Binder 结合的演示仓库在语言支持方面src/jupytext/languages.py 的_SCRIPT_EXTENSIONS映射定义了各脚本扩展名对应的语言与注释符例如.pyPython#、.R/.rR#、.jlJulia#、.cppC//、.rsRust//、.tsTypeScript//、.scalaScala//、.ss/.clj/.scmScheme/Clojure;;、.shbash#、.mMATLAB%、.wolframWolfram(*/*)、.sasSAS/*/*/、.lgtLogtalk%等。percent、light、nomarker三种格式在 src/jupytext/formats.py 中都会为以上全部扩展名注册读写实现因此只要语言在支持列表内就可无缝使用这三种脚本格式sphinx仅面向.pymarimo仅面向 Python。七、小结percent、light、nomarker、marimo与sphinx五种格式共同构成了 Jupytext 的脚本化笔记本矩阵percent胜在编辑器生态与显式结构light胜在最小侵入与可自定义标记nomarker适合脚本即产品的简单场景marimo面向响应式 Python 工作流sphinx则服务文档示例生态。结合本文给出的命令行jupytext --update-metadata、jupytext --test、配置文件jupytext.toml 配置指南与源码依据你可以为项目中的每种脚本语言确定最合适的文本笔记本格式并借助 demo 目录 中的三种示例文件.pct.py、.lgt.py、.spx.py进一步对照实际写法。赞分享开发工具【免费下载链接】jupytextJupyter Notebooks as Markdown Documents, Julia, Python or R scripts项目地址https://gitcode.com/gh_mirrors/ju/jupytext点击查看免费下载相关推荐Jupytext 实战将 .NET C 交互式笔记本转换为 MyST Markdown 文本格式Jupytext 实战将 .NET C 交互式笔记本转换为 MyST Markdown 文本格式 Jupytext 的核心能力是让 Jupyter 笔记本以可开发工具Jupytext项目详解实现Jupyter笔记本与文本格式的双向转换Jupytext项目详解实现Jupyter笔记本与文本格式的双向转换 项目概述 Jupytext是一个强大的Python工具包它实现了Jupyter笔记本开发工具Jupytext命令行工具使用指南实现Jupyter笔记本与文本格式互转Jupytext命令行工具使用指南实现Jupyter笔记本与文本格式互转 引言 Jupytext作为Jupyter生态中的重要工具提供了强大的命令行接口 C开发工具上一篇如何快速解决Traefik v3.3.0仪表盘访问异常从配置到修复的完整指南下一篇Bluebird 安装与集成完全指南浏览器、Node.js、Webpack 与调试配置详解创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表