配置#
Sphinx-Gallery 的配置和定制主要通过在 conf.py
文件中指定的字典进行。可能键的列表 如下所示,并在后续章节中详细说明。
在使用这些标志时,最好确保源 Python 文件与生成的 HTML 和 iPython 笔记本等效(即确保 .py == .html == .ipynb
)。只有在必要时才应违反此原则,并应逐案处理。
配置选项#
全局 conf.py
配置#
可以在 Sphinx conf.py
文件中,在 sphinx_gallery_conf
字典内设置的 Sphinx-Gallery 配置选项。
画廊文件和排序
examples_dirs
和gallery_dirs
(管理多个画廊)filename_pattern
、ignore_pattern
、example_extensions
和filetype_parsers
(通过匹配模式解析和执行示例)copyfile_regex
(手动传递文件)subsection_order
(排序画廊子节)within_subsection_order
(排序画廊示例)nested_sections
(嵌套画廊章节)
示例执行
reset_argv
(将命令行参数传递给示例脚本)capture_repr
和ignore_repr_types
(控制捕获的输出)plot_gallery
(构建而不执行示例)run_stale_examples
(重新运行过时的示例)abort_on_example_error
(在第一次失败时中止构建)expected_failing_examples
(如果特定示例出错,则不使构建失败)only_warn_on_example_error
(在出错时永远不使构建失败)reset_modules
和reset_modules_order
(重置模块)parallel
(并行构建示例)
交叉引用
reference_url
、prefer_full_module
(向您的示例添加 intersphinx 链接)backreferences_dir
、doc_module
、exclude_implicit_doc
和inspect_global_variables
(添加迷你画廊)minigallery_sort_order
(从文件中排序迷你画廊缩略图)
图像和缩略图
default_thumb_file
(使用自定义默认缩略图)thumbnail_size
(设置画廊缩略图大小)image_srcset
(多分辨率图像)image_scrapers
(图像抓取器)compress_images
(压缩图像)
计算成本
min_reported_time
(最小报告时间)write_computation_times
(写入计算时间)show_memory
(显示内存消耗)junit
(使用 JUnit XML 文件)
Jupyter 笔记本和交互性
notebook_extensions
(控制笔记本下载链接)promote_jupyter_magic
(使单元格魔法在笔记本中可执行)first_notebook_cell
和last_notebook_cell
(添加您自己的第一个和最后一个笔记本单元格)notebook_images
(向笔记本添加图像)pypandoc
(使用 pypandoc 将 reST 转换为 markdown)binder
(为画廊笔记本生成 Binder 链接(实验性))jupyterlite
(为画廊笔记本生成 JupyterLite 链接(实验性))
外观
line_numbers
(向示例添加行号)remove_config_comments
(删除配置注释)show_signature
(显示签名)download_all_examples
(禁用所有脚本的下载按钮)
其他
recommender
(启用示例推荐系统)log_level
(设置日志级别)show_api_usage
和api_usage_ignore
(显示 API 使用情况)
示例内部的配置#
一些选项也可以在每个文件的基础上设置或覆盖
# sphinx_gallery_line_numbers
(向示例添加行号)# sphinx_gallery_thumbnail_number
(选择缩略图图像)# sphinx_gallery_thumbnail_path
(提供缩略图图像的图像)# sphinx_gallery_failing_thumbnail
(控制缩略图在失败示例中的行为)# sphinx_gallery_dummy_images
(生成虚拟图像)# sphinx_gallery_capture_repr
(控制捕获的输出)# sphinx_gallery_multi_image
(控制来自同一代码块的多个图形的布局)
一些选项可以在文件中的每个代码块的基础上设置
# sphinx_gallery_defer_figures
(使用多个代码块创建单个图形)# sphinx_gallery_multi_image_block
(控制来自同一代码块的多个图形的布局)
文件中可以针对每行设置一些选项: - # sphinx_gallery_start_ignore
和 # sphinx_gallery_end_ignore
(隐藏代码块)
另请参阅 移除配置注释,以从渲染的示例中隐藏文件中的配置注释。
构建选项#
一些选项可以在构建执行步骤中设置,例如使用 Makefile
make html-noplot
(不执行示例进行构建)make html_abort_on_example_error
(第一次失败时中止构建)
CSS 更改#
某些内容可以直接在 CSS 中调整
.sphx-glr-thumbcontainer
(设置图库缩略图大小)
移除警告#
要防止警告被捕获并包含在构建的文档中,你可以在 conf.py
文件中使用 warnings
包。例如,要删除特定 Matplotlib agg 警告,你可以在你的 conf.py
文件中添加以下内容
import warnings
warnings.filterwarnings("ignore", category=UserWarning,
message='Matplotlib is currently using agg, which is a'
' non-GUI backend, so cannot show the figure.'
'|(\n|.)*is non-interactive, and thus cannot be shown')
到你的 conf.py
文件中。
请注意,上述 Matplotlib 警告默认情况下会被移除。
导入可调用对象#
Sphinx-Gallery 中的配置值,如果是实例化的类、类或函数,则应将它们作为完全限定的名称字符串传递给这些对象。Sphinx-Gallery 必须能够导入该对象。
实现这一点的两种常见方法是
使用你的包定义你的对象。例如,你可以编写一个函数
def my_sorter
并将其放在mymod/utils.py
中,然后使用sphinx_gallery_conf = { #..., "minigallery_sort_order": "mymod.utils.my_sorter", #... }
使用你的文档定义你的对象。例如,你可以在不同的路径中添加特定于文档的内容,并确保它可以在构建时解析。例如,你可以创建一个文件
doc/sphinxext.py
并定义你的函数def plotted_sorter(fname): return not fname.startswith("plot_"), fname
并在你的配置中设置
sys.path.insert(0, os.path.dirname(__file__)) sphinx_gallery_conf = { #..., "minigallery_sort_order": "sphinxext.plotted_sorter", #... }
Sphinx-Gallery 会将
"sphinxext.plotted_sorter"
解析为plotted_sorter
对象,因为doc/
目录位于路径的开头。
内置类,例如 sphinx_gallery.sorting.FileNameSortKey
和类似的类,可以使用更短的直接别名字符串,例如 "FileNameSortKey"
(有关详细信息,请参阅 对图库示例排序)。
注意
Sphinx-Gallery >0.16.0 支持使用完全限定的名称字符串,作为对 Sphinx >7.3.0 对 conf.py
文件的缓存和序列化检查所做更改的响应。
这意味着,如果你通过名称字符串传递配置值,则以前使用类实例作为配置值以确保 __repr__
在构建之间保持稳定是多余的。使用名称字符串时,配置对象只需是一个函数即可。
确保 __repr__
稳定#
为了向后兼容性,Sphinx-Gallery 允许某些配置值成为可调用对象,而不是 可导入的名称字符串。
如果你希望使用可调用对象,则必须确保 __repr__
在运行之间保持稳定。Sphinx 通过使用 md5(str(obj).encode()).hexdigest()
在 sphinx/builders/html.py
中检查 config 值,来确定构建环境是否已更改,以及是否应重新编写所有文档。Python 中的默认类实例在其 __repr__
中包含其内存地址,这就是为什么通常 __repr__
会在每次构建中更改的原因。
你的可调用对象应该是一个类,它定义了一个稳定的 __repr__
方法。例如,sphinx_gallery.sorting.ExplicitOrder
的稳定性是通过自定义的 __repr__
来确保的
def __repr__(self):
return '<%s: %s>' % (self.__class__.__name__, self.ordered_list)
因此,只有在指定的有序列表发生更改时才会重新构建所有文件。
管理多个图库#
Sphinx-Gallery 仅支持其图库目录中的一个级别子文件夹嵌套。例如,我们的 使用 Matplotlib 的基本图库,其父图库位于 examples/ 中,而子部分(也称为子图库)位于 examples/no_output/ 中。不支持进一步的子文件夹。这对你来说可能是一个限制。或者,你可能想要为不同的目的创建单独的图库;一个示例图库和一个教程图库。为此,请在你的 Sphinx conf.py
文件中将 Sphinx-Gallery 配置字典键 examples_dirs 和 gallery_dirs 设置为目录列表
sphinx_gallery_conf = {
...
'examples_dirs': ['../examples', '../tutorials'],
'gallery_dirs': ['auto_examples', 'tutorials'],
}
请记住,这两个列表必须具有相同的长度。
注意
如果你的示例需要很长时间才能运行,请考虑查看为每个图库目录生成的 执行时间 文件(只要该目录中的任何示例在构建期间实际上都已执行)以及所有图库的全局文件。
通过匹配模式解析和执行示例#
默认情况下,Sphinx-Gallery 会解析并添加所有具有 .py
扩展名的文件到图库中,但仅执行以 plot_
开头的文件。这些行为由 ignore_pattern
、filename_pattern
和 example_extensions
条目控制,这些条目具有默认值
sphinx_gallery_conf = {
...
'filename_pattern': '/plot_',
'ignore_pattern': r'__init__\.py',
'example_extensions': {'.py'}
}
要完全从图库中省略一些文件(即,不执行、解析或添加它们),你可以更改 ignore_pattern
选项。要选择实际上执行了哪些解析并添加的 Python 脚本,你可以修改 filename_pattern
。例如
sphinx_gallery_conf = {
...
'filename_pattern': '/plot_compute_',
}
将构建所有以 plot_compute_
开头的示例。键 filename_pattern
(以及 ignore_pattern
)接受 正则表达式,这些表达式将与示例的完整路径匹配。这就是为什么需要前导 '/'
的原因。如果用户希望与操作系统无关,建议他们使用 re.escape(os.sep)
而不是 '/'
。
如果只想构建示例的一部分,filename_pattern
选项也很有用。例如,你可能只想构建一个示例,以便可以在文档中链接它。在这种情况下,你会执行
sphinx_gallery_conf = {
...
'filename_pattern': r'plot_awesome_example\.py',
}
这里,应该对点 r'\.'
进行转义,否则 Python 正则表达式 将匹配任何字符。但是,由于目标是特定文件,即使没有这个转义字符,它也会匹配文件名中的点。
注意
Sphinx-Gallery 仅重新运行已更改的示例(根据它们的 MD5 哈希)。有关信息,请参阅下面的 重新运行过时的示例。
类似地,要仅构建特定目录中的示例,你可以执行
sphinx_gallery_conf = {
...
'filename_pattern': '/directory/plot_',
}
或者,你可以跳过执行某些示例。例如,要跳过构建以 plot_long_examples_
开头的示例,你可以执行
sphinx_gallery_conf = {
...
'filename_pattern': '/plot_(?!long_examples)',
}
由于模式被解析为 正则表达式,因此建议用户咨询 正则表达式 模块以了解更多详细信息。
注意
请记住,Sphinx 允许从命令行覆盖 conf.py
值,因此你可以通过类似以下命令直接构建单个示例
$ sphinx-build -D sphinx_gallery_conf.filename_pattern=plot_specific_example\.py ...
你还可以通过将它们的扩展名添加到 example_extensions
中来解析和突出显示其他语言中的语法示例,尽管它们不会被执行。例如,要包含 Python、Julia 和 C++ 中的示例
sphinx_gallery_conf = {
...
'example_extensions': {'.py', '.jl', '.cpp'}
}
Pygments 库支持解析和语法突出显示,语言由文件扩展名确定。要覆盖 Pygments 的默认文件关联,可以使用 filetype_parsers
选项来指定一个 dict
,它将 example_extensions
中的任何文件扩展名映射到任何 pygments 语言名称。例如
sphinx_gallery_conf = {
...
'filetype_parsers': {'.m': 'Matlab'}
}
重新运行过时的示例#
默认情况下,Sphinx-Gallery 仅重建已更改的示例。例如,从干净的 doc/
目录开始时,运行你的 HTML 构建一次会导致 Sphinx-Gallery 执行所有匹配给定 文件名/忽略模式 的示例。然后,第二次运行完全相同的命令不应该运行任何示例,因为每个示例的 MD5 哈希将与该示例文件在第一次构建期间的 MD5 哈希(保存到磁盘上,作为生成目录中的 <filename>.md5
)进行比较。它们将匹配,因此示例将被确定为“过时”,并且不会被 Sphinx-Gallery 重新构建。此设计功能通过仅在示例更改时重新构建示例来加快文档迭代速度。
但是,这在某些调试和迭代模式下会造成问题。假设您有一个特定的示例,您希望在修改底层库中某个函数的同时反复重建它,但不想更改示例文件本身的内容。为此,您需要对示例进行一些更改(例如,添加/删除换行符)或删除 .md5
文件以强制 Sphinx-Gallery 重建示例。相反,您可以使用以下配置值
sphinx_gallery_conf = = {
...
'run_stale_examples': True,
}
使用此配置,所有与文件名/忽略模式匹配的示例都将被重建,即使它们的 MD5 哈希表明示例没有更改。您可以将此与 文件名/忽略模式 结合使用,以反复重新运行单个示例。例如,这可以从命令行完成
$ make html SPHINXOPTS="-D sphinx_gallery_conf.run_stale_examples=True -D sphinx_gallery_conf.filename_pattern='my_example_name'"
此命令将导致任何与文件名模式 'my_example_name'
匹配的示例被重建,无论其 MD5 哈希值如何。
将命令行参数传递给示例脚本#
默认情况下,Sphinx-Gallery 不会将任何命令行参数传递给示例脚本。通过设置 reset_argv
选项,可以更改此行为并将命令行参数传递给示例脚本。 reset_argv
需要是一个 Callable
,它接受 gallery_conf
和 script_vars
字典作为输入,并返回一个字符串列表,这些字符串作为附加命令行参数传递给解释器。
一个 reset_argv
示例可能是
from pathlib import Path
def reset_argv(sphinx_gallery_conf, script_vars):
src_file = Path(script_vars['src_file']).name
if src_file == 'example1.py':
return ['-a', '1']
elif src_file == 'example2.py':
return ['-a', '2']
else:
return []
此函数在 doc/sphinxext.py
中定义,我们确保它可以导入(参见 导入可调用对象)。
这可以包含在配置字典中,如下所示
sphinx_gallery_conf = {
...
'reset_argv': "sphinxext.reset_argv",
}
然后由 Sphinx-Gallery 解析为可调用对象 reset_argv
并用作
import sys
sys.argv[0] = script_vars['src_file']
sys.argv[1:] = reset_argv(gallery_conf, script_vars)
注意
为了向后兼容,您也可以将配置设置为可调用对象,但您需要确保 __repr__
在运行之间保持稳定。参见 确保稳定的 __repr__。
排序画廊小节#
画廊小节(又称子画廊)默认情况下按其文件夹名称的字母顺序排序,因此您可以始终通过更改文件夹名称来组织它们。或者,您可以通过配置值“subsection_order”指定顺序,通过提供小节的列表,这些小节作为相对于 conf.py
的路径,以所需的顺序排列
sphinx_gallery_conf = {
...
'examples_dirs': ['../examples','../tutorials'],
'subsection_order': ['../examples/sin_func',
'../examples/no_output',
'../tutorials/seaborn'],
}
这里我们构建了 2 个主要画廊“examples”和“tutorials”,每个画廊都有小节。您必须列出所有小节。如果太麻烦,一个条目可以是“*”,它将收集所有未列出的小节,例如 ["first_subsection", "*", "last_subsection"]
。
更普遍地说,您可以将“subsection_order”设置为任何可调用对象,它将用作对小节路径的排序键函数。有关更多信息,请参见 自定义排序键。
事实上,上面的列表是一个便利的快捷方式,它在内部被包装在 sphinx_gallery.sorting.ExplicitOrder
中作为排序键。
注意
Sphinx-Gallery <0.16.0 需要将列表包装在 ExplicitOrder
中
from sphinx_gallery.sorting import ExplicitOrder
sphinx_gallery_conf = {
...
'subsection_order': ExplicitOrder([...])
}
不鼓励使用此模式,建议改为传递简单的列表。
请记住,我们对构建的所有画廊使用单个排序键,因此我们在相应的小节文件夹中包含每个画廊的前缀。不会为每个画廊定义排序键。您可以使用 Linux 路径,如果您的文档是在 Windows 系统中构建的,路径将被转换为相应的工作路径,反之则不成立。
排序画廊示例#
在给定的画廊(子)节中,示例文件通过使用标准 sorted()
函数按默认情况下设置为 NumberOfCodeLinesSortKey(src_dir)
的 key
参数进行排序,该参数根据代码行数对文件进行排序
sphinx_gallery_conf = {
...
'within_subsection_order': "NumberOfCodeLinesSortKey",
}
由 within_subsection_order
支持的内置便捷类
sphinx_gallery.sorting.NumberOfCodeLinesSortKey
(默认)按代码行数排序。
注意
这些内置的 Sphinx-Gallery 类可以使用词干来指定,例如 "NumberOfLinesSortKey"
。它在功能上等同于提供完全限定的名称 "sphinx_gallery.sorting.NumberOfCodeLinesSortKey"
。有关详细信息,请参见 导入可调用对象。
自定义排序键#
您可以为以下配置创建自定义排序键可调用对象
最好的方法是定义一个排序函数,该函数接收传递的路径字符串
def plotted_sorter(fname):
return not fname.startswith("plot_"), fname
确保它可以导入(参见 导入可调用对象)并设置您的配置
sphinx_gallery_conf = {
#...,
"minigallery_sort_order": "sphinxext.plotted_sorter",
#...
}
为了向后兼容,您也可以将配置设置为可调用对象,但您需要确保 __repr__
在运行之间保持稳定。有关详细信息,请参见 确保稳定的 __repr__。
我们建议您使用 sphinx_gallery.sorting.FunctionSortKey
,因为它将确保 __repr__
在运行之间保持稳定。
sphinx_gallery.sorting.FunctionSortKey
在初始化时接受一个函数。您可以通过使用您的排序键函数实例化 FunctionSortKey
实例来创建您的排序键可调用对象。例如,以下 minigallery_sort_order
配置(它按路径排序)将使用每个文件名的前 10 个字母进行排序
sphinx_gallery_conf = {
#...,
"minigallery_sort_order": FunctionSortKey(
lambda filename: filename[:10]),
#...
}
在示例中添加 intersphinx 链接#
Sphinx-Gallery 使您能够在示例脚本中添加超链接,以便您可以将使用的函数/方法/属性/对象/类链接到它们匹配的在线文档。画廊中的此类代码片段看起来像这样
y = np.sin(x)
在我们的示例 入门示例 - 绘制正弦曲线 中查看它的全部实际操作。
要使它在您的文档中起作用,您需要将 Sphinx conf.py
文件中的配置字典中包含
sphinx_gallery_conf = {
...
'reference_url': {
# The module you locally document uses None
'sphinx_gallery': None,
}
}
要链接到外部模块,如果您使用 Sphinx 扩展 sphinx.ext.intersphinx
,则无需进行任何其他更改,因为 intersphinx
索引将自动使用。如果您没有使用 intersphinx
,那么您应该添加指向包含 searchindex.js
的目录的条目,例如 'matplotlib': 'https://matplotlib.net.cn'
。
如果您希望对普通的 reST 文档执行相同的操作,请参见 纯 reST 示例。
解析模块路径#
在查找指向我们使用的对象的链接时,我们默认使用最短的模块路径,并检查它是否仍然指向同一个对象。这是因为,在更深层模块中定义的类通常在更浅层的模块中进行文档化,因为它是较高级别模块的 __init__.py
中导入的(因此,这是用户期望它所在的命名空间)。
但是,如果您在代码中使用继承类,并且遇到指向对象的基类而不是子类的链接不正确的情况,则选项 prefer_full_module
可能会解决您的问题。有关更多信息,请参见 GitHub 问题。
要使它在您的文档中起作用,您需要在 conf.py
中的 Sphinx-Gallery 配置字典中包含 prefer_full_module
sphinx_gallery_conf = {
...
# Regexes to match the fully qualified names of objects where the full
# module name should be used. To use full names for all objects use: '.*'
'prefer_full_module': {r'module\.submodule'}
}
在上面的示例中,所有与正则表达式 'module\.submodule'
匹配的完全限定名称在创建链接时将使用完整的模块名称(例如,module.submodule.meth),而不是短模块名称(例如,module.meth)。所有其他名称将使用(默认)链接方式。
添加迷你画廊#
Sphinx-Gallery 提供了 sphinx_gallery.directives.MiniGallery
指令,方便您轻松地将缩减版的 Gallery 添加到您的 Sphinx 文档 .rst
文件中。因此,minigallery 指令支持传递以下任何内容的列表(空格分隔):
对象的完全限定名(参见 为 API 文档添加迷你画廊) - 这会添加所有在代码中使用该对象或在示例文本中引用该对象的示例。
示例 Python 文件的路径式字符串,包括 glob 样式(参见 使用文件路径创建迷你画廊)。
要使用对象名称,您必须启用反向引用生成,有关详细信息,请参见 为 API 文档添加迷你画廊。如果未启用反向引用生成,则 MiniGallery
指令中的对象条目将被忽略,所有条目将被视为路径式字符串或 glob 样式的路径式字符串。有关详细信息,请参见 使用文件路径创建迷你画廊。
为 API 文档添加迷你画廊#
Sphinx-Gallery 可以为指定模块中的对象生成迷你画廊,其中包含所有满足以下条件的示例:
在代码中使用该函数/方法/属性/对象或实例化该类(称为隐式反向引用),或者
使用 sphinx 标记
:func:
/:meth:
/:attr:
/:obj:
/:class:
在文本块中引用该函数/方法/属性/对象/类。如果您已在conf.py
中将 default_role 设置为这些角色中的任何一个,则可以省略此角色标记(称为显式反向引用)。
这使您可以将对象的完全限定名(例如,函数、方法、属性、类)传递给 minigallery 指令,以添加与该对象相关的所有示例的迷你画廊。这在 API 文档中可能很有用。
隐式反向引用对自动记录在代码中使用的对象以及显式实例化的类很有用。任何在代码中使用对象的示例都将隐式添加为反向引用。显式反向引用用于在示例文本中显式引用的对象。它们对于通常在代码中隐式返回而不是显式实例化的类很有用(例如,matplotlib.axes.Axes
,它通常只在函数调用中间接实例化)。
例如,我们可以嵌入一个小型画廊,其中包含所有使用或引用 numpy.exp
的示例,如下所示:
使用 numpy.exp
的示例#
为了使这种行为可用,您必须在 Sphinx-Gallery 配置 conf.py
文件中使用以下内容激活它:
sphinx_gallery_conf = {
...
# directory where function/class granular galleries are stored
'backreferences_dir' : 'gen_modules/backreferences',
# Modules for which function/class level galleries are created. In
# this case sphinx_gallery and numpy in a tuple of strings.
'doc_module' : ('sphinx_gallery', 'numpy'),
# Regexes to match objects to exclude from implicit backreferences.
# The default option is an empty set, i.e. exclude nothing.
# To exclude everything, use: '.*'
'exclude_implicit_doc': {r'pyplot\.show'},
}
您在 backreferences_dir
中指定的路径(这里我们选择 gen_modules/backreferences
)将填充 ReStructuredText 文件,这些文件的名称以 '。examples' 结尾。每个 .rst 文件将包含缩减版的画廊,该画廊特定于每个函数/类,这些函数/类在所有示例中使用,并且属于 doc_module
中列出的模块。请注意,将为所有对象生成反向引用文件。任何不在任何示例中使用的对象都将有一个空文件,以防止在 autodoc 解析期间出现包含错误。
backreferences_dir
应该是一个字符串或 pathlib.Path
对象,该对象相对于 conf.py
文件,或者为 None
。默认情况下为 None
。
有时,有些函数几乎在给定模块的每个示例中都被使用,例如 Matplotlib 中的 pyplot.show
或 pyplot.subplots
函数,因此大量通常是虚假的示例将链接到这些函数。为了防止这种情况,您可以通过将它们包含在 exclude_implicit_doc
中的正则表达式中来排除某些对象的隐式反向引用。以下设置将排除所有隐式反向引用,以便仅为在文档块中由 Sphinx 标记显式提到的对象创建示例画廊:{'.*'}
。要排除上面提到的函数,您需要使用 {r'pyplot\.show', r'pyplot\.subplots'}
(请注意转义以匹配点而不是任何字符,如果名称是明确的,您也可以写 pyplot.show
或只写 show
)。
使用文件路径创建迷你画廊#
有时您可能想要使用没有共同函数的文件(例如一组教程)显式创建 mini-gallery
。因此,minigallery 指令还支持传入:
sphinx 画廊示例文件的路径式字符串(相对于
conf.py
)Sphinx-Gallery 示例文件的 glob 样式路径式字符串(相对于
conf.py
)
例如,下面的 rst 添加了所有使用特定函数 numpy.exp
的示例、示例 examples/plot_sin_.py
以及所有与字符串 /examples/plot_4*
匹配的文件的缩减版 Gallery:
.. minigallery::
:add-heading:
numpy.exp
../examples/plot_0_sin.py
../examples/plot_4*
列出多个项目会将所有示例合并到一个迷你画廊中。只有当文件存在,或者项目实际上在示例中被使用或引用时,才会显示迷你画廊。如果缩略图对应于多个对象名称或一个对象名称和文件/glob 输入,则缩略图也可能重复。
使用多个对象之一的示例#
您也可以在指令主体中提供项目列表:
.. minigallery::
:add-heading:
numpy.exp
../examples/plot_0_sin.py
../examples/plot_4*
如果未提供字符串参数,则当仅列出单个项目时,add-heading
选项会为迷你画廊添加标题,默认标题为:
“使用{完整限定的对象名称}的示例”
对于具有多个项目的画廊,建议指定自定义标题消息,因为否则默认消息为:
“多个对象之一的示例”。
上面显示的示例迷你画廊使用默认标题级别 ^
。可以使用 heading-level
选项更改此选项,该选项接受单个字符(例如,-
)。
您也可以将输入作为空格分隔的参数列表传递给 minigallery 指令:
.. minigallery:: numpy.exp ../examples/plot_0_sin.py ../examples/plot_4*
对来自文件的迷你画廊缩略图进行排序#
minigallery 指令会生成一个缩略图画廊,这些缩略图对应于输入文件字符串或对象名称。您可以通过 minigallery_sort_order
配置指定迷你画廊缩略图的顺序,该配置将在对所有迷你画廊进行排序时传递给 sorted()
的 key
参数。排序使用对应于输入的画廊示例的路径(例如,path/to/plot_example.py
)和反向引用(例如,path/to/numpy.exp.examples
)。
有关编写自定义排序键的详细信息,请参见 自定义排序键。
例如,要将反向引用缩略图放在最后,我们可以在 doc/sphinxext.py
中定义以下函数(请注意,反向引用文件名不以“plot_”开头,并且 False
在排序时位于 True
之前,因为 0 小于 1):
def function_sorter(x)
return (not os.path.basename(x).startswith("plot_"), x)::
然后,我们可以将配置设置为(确保函数是 可导入的):
sphinx_gallery_conf = {
#...,
"minigallery_sort_order": "sphinxext.function_sorter",
#...
}
Sphinx-Gallery 将解析 "sphinxext.function_sorter"
为 function_sorter
对象。
对从 API 反向引用 生成的缩略图集进行排序(即链接到限定对象名称输入的缩略图)不受支持,但排序函数可用于定位整个反向引用缩略图集,因为 minigallery 排序会传递 {input}.example
反向引用文件名。如果缩略图对应于多个对象名称或一个对象名称和文件/glob 输入,则缩略图也可能重复。
使用指向示例的链接自动记录您的 API#
先前功能可以与标准 sphinx 扩展 autodoc 和 autosummary 相结合,为所有模块自动执行。首先在 conf.py
的扩展列表中启用它们:
import sphinx_gallery
extensions = [
...
'sphinx.ext.autodoc',
'sphinx.ext.autosummary',
'sphinx_gallery.gen_gallery',
]
# generate autosummary even if no references
autosummary_generate = True
autodoc 和 autosummary 是非常强大的扩展,请阅读有关它们的更多信息。在本示例中,我们将解释如何自动生成 Sphinx-Gallery API 参考。文档是在模块级别完成的。我们首先从 reference.rst
文件开始:
.. _sphx_glr_api_reference:
Sphinx-Gallery API Reference
============================
.. note::
Sphinx-Gallery is typically used indirectly via Sphinx execution and
configuration variables, see :ref:`configuration` for how to do this.
However, as a standard Python project, we document many functions and
classes as well below, even though these will typically not be needed
by end users.
.. currentmodule:: sphinx_gallery
.. automodule:: sphinx_gallery
:no-members:
:no-inherited-members:
:py:mod:`sphinx_gallery`:
.. autosummary::
:toctree: gen_modules/
:template: module.rst
gen_gallery
backreferences
gen_rst
scrapers
py_source_parser
block_parser
docs_resolv
notebook
downloads
sorting
interactive_example
directives
.. currentmodule:: sphinx_gallery.utils
.. automodule:: sphinx_gallery.utils
:no-members:
:no-inherited-members:
:py:mod:`sphinx_gallery.utils`:
.. autosummary::
:toctree: gen_modules/
:template: module.rst
optipng
重要的指令是 currentmodule
,我们用它来指定要记录的模块,对于我们的目的,它是 sphinx_gallery
。 autosummary
指令负责生成 rst
文件,用于记录每个模块。 autosummary
接受选项 toctree,这是保存 rst
文件的位置,以及 template,它是一个文件,描述了模块 rst
文档文件将如何构建,最后,我们编写要记录的模块,在本例中是 Sphinx-Gallery 的所有模块。
模板文件 module.rst
用于 autosummary
指令,必须保存在路径 _templates/module.rst
中。我们将在以下块中展示我们的配置。最相关的部分是在第 12-21 行之间定义的循环,它解析模块的所有函数/类。在那里,我们使用了上一节中介绍的 minigallery
指令。
我们还在包含示例迷你画廊之前添加了一个交叉引用标签(在第 16 行)。这使您可以使用 :ref:`sphx_glr_backref_<fun/class>`
来引用模块所有函数/类的迷你画廊,其中 ‘<fun/class>’ 是使用点符号的函数/类的完整路径(例如,sphinx_gallery.backreferences.identify_names
)。例如,请参阅:使用 sphinx_gallery.backreferences.identify_names 的示例。
1{{ fullname }}
2{{ underline }}
3
4.. automodule:: {{ fullname }}
5
6 {% block functions %}
7 {% if functions %}
8
9 Functions
10 ---------
11
12 {% for item in functions %}
13
14 .. autofunction:: {{ item }}
15
16 .. _sphx_glr_backref_{{fullname}}.{{item}}:
17
18 .. minigallery:: {{fullname}}.{{item}}
19 :add-heading:
20
21 {%- endfor %}
22 {% endif %}
23 {% endblock %}
24
25 {% block classes %}
26 {% if classes %}
27
28 Classes
29 -------
30
31 {% for item in classes %}
32 .. autoclass:: {{ item }}
33 :members:
34
35 .. _sphx_glr_backref_{{fullname}}.{{item}}:
36
37 .. minigallery:: {{fullname}}.{{item}}
38 :add-heading:
39
40 {%- endfor %}
41 {% endif %}
42 {% endblock %}
43
44 {% block exceptions %}
45 {% if exceptions %}
46
47 Exceptions
48 ----------
49
50 .. autosummary::
51 {% for item in exceptions %}
52 {{ item }}
53 {%- endfor %}
54 {% endif %}
55 {% endblock %}
切换全局变量检查#
默认情况下,Sphinx-Gallery 将检查每个代码块末尾的全局变量(和代码对象),以尝试查找变量和方法调用的类。它还尝试查找在类上调用的方法。例如,以下代码
lst = [1, 2]
fig, ax = plt.subplots()
ax.plot(lst)
最终将包含以下链接(假设 intersphinx 已正确设置)
但是,此功能可能无法在所有情况下都能正常工作。此外,如果变量名在同一脚本中被重复使用以引用不同的类,它将中断。
要禁用此全局变量检查,您可以使用以下配置键
sphinx_gallery_conf = {
...
'inspect_global_variables' : False,
}
使用 CSS 样式化代码链接#
代码块中的每个链接都将使用两个或三个 CSS 类进行装饰。
sphx-glr-backref-module-*
以对象所在的模块命名的 CSS 类。
*
代表模块,例如sphx-glr-backref-module-matplotlib-figure
。
sphx-glr-backref-type-*
以对象类型命名的 CSS 类,其中
*
代表对象类型。这是一个经过清理的 intersphinx 类型,例如py:class
将具有 CSS 类sphx-glr-backref-type-py-class
。
sphx-glr-backref-instance
第三个“可选”类,仅当对象是类的实例(而不是,例如,类本身、方法或函数)时才会添加。默认情况下,Sphinx-Gallery 在
gallery.css
中添加以下 CSSa.sphx-glr-backref-instance { text-decoration: none; }
这样做是为了减少实例链接在示例代码中的视觉影响。这意味着对于以下代码
x = Figure()
x
是一个类的实例,将具有sphx-glr-backref-instance
CSS 类,并且不会被装饰。但是,Figure
是一个类,因此不会具有sphx-glr-backref-instance
CSS 类,因此将以给定父样式中链接的标准方式进行装饰。
这三个 CSS 类旨在对不同链接的装饰方式提供细粒度的控制。例如,使用 CSS 选择器,您可以选择避免突出显示任何 sphx-glr-backref-*
链接,除了您允许的链接(例如,来自您自己模块的链接)。例如,以下 css 阻止任何模块(除了 matplotlib)被装饰
a[class^="sphx-glr-backref-module-"] {
text-decoration: none;
}
a[class^="sphx-glr-backref-module-matplotlib"] {
text-decoration: underline;
}
除了 text-decoration
之外,可能还有其他值得设置的元素。
您可以通过在 Sphinx 配置中包含您自己的 CSS 文件来添加这些 CSS 类html_static_path
,它将覆盖 Sphinx-Gallery CSS 文件 中的默认 CSS 类。
使用自定义默认缩略图#
如果您想为未生成任何绘图的示例使用自己的图像作为缩略图,您可以通过编辑 Sphinx conf.py
文件来指定它。您需要在配置字典中添加一个名为 default_thumb_file 的键。例如
sphinx_gallery_conf = {
...
'default_thumb_file': 'path/to/thumb/file.png',
}
向示例添加行号#
可以通过添加全局 line_numbers
设置在列表中显示行号
sphinx_gallery_conf = {
...
'line_numbers': True,
}
或者通过在示例脚本中添加注释来添加行号,这将覆盖任何全局设置
# sphinx_gallery_line_numbers = True
删除配置注释#
某些配置可以通过在示例源文件中添加具有模式 # sphinx_gallery_config [= value]
的特殊注释来指定。默认情况下,源文件按原样解析,因此注释将出现在示例中。
要从渲染的示例中删除注释,请设置选项
sphinx_gallery_conf = {
...
'remove_config_comments': True,
}
这只会从代码块中删除配置注释,而不会从文本块中删除配置注释。但是,请注意,从技术上讲,文件级配置注释在放置在代码块或文本块中时都会起作用。
添加您自己的第一个和最后一个笔记本单元格#
Sphinx-Gallery 允许您向每个生成的笔记本添加您自己的第一个和/或最后一个单元格。添加第一个单元格对于包含在笔记本中运行正常但不在 .py
文件中所需的代码很有用。默认情况下,不会添加第一个单元格。
添加最后一个单元格对于执行所需的操作(例如,报告用户的环境)很有用。默认情况下,不会添加最后一个单元格。
您可以通过修改 first_notebook_cell
和 last_notebook_cell
配置参数来选择您喜欢的任何文本。例如,您可以添加以下第一个单元格
# This cell is added by Sphinx-Gallery
# It can be customized to whatever you like
这是通过以下配置实现的
sphinx_gallery_conf = {
...
'first_notebook_cell': ("# This cell is added by Sphinx-Gallery\n"
"# It can be customized to whatever you like\n"
)
}
通过设置 last_notebook_cell
参数,可以类似地添加最后一个单元格
sphinx_gallery_conf = {
...
'first_notebook_cell': ("# This cell is added by Sphinx-Gallery\n"
"# It can be customized to whatever you like\n"
),
'last_notebook_cell': "# This is the last cell",
}
如果 first_notebook_cell
或 last_notebook_cell
的值设置为 None
,则不会向笔记本添加任何额外的第一个或最后一个单元格。
向笔记本添加图像#
当生成笔记本时,默认情况下 (notebook_images = False
) 来自 reST 文档块中 image 指令的图像路径(不是从代码生成的图像)将使用它们的原始路径包含在 markdown 中。这包括预期存在于本地文件系统上的图像的路径,这对于下载笔记本的人来说不太可能发生。
通过设置 notebook_images = True
,图像将通过 Base64 编码的 数据 URI 嵌入到生成的笔记本中。由于通过数据 URI 包含图像会显着增加笔记本的大小,因此建议仅在整个画廊中使用小图像时使用此方法。
另一种方法是提供一个前缀字符串,该字符串将用于图像,例如托管文档的根 URL。例如,以下配置
sphinx_gallery_conf = {
...
'examples_dirs': ['../examples'],
'gallery_dirs': ['auto_examples'],
...
'notebook_images': 'https://project.example.com/en/latest/',
...
}
并且在 reST 文档块中有一个示例 image 指令为
.. image:: ../_static/example.jpg
:alt: An example image
图像将添加到生成的笔记本中,指向源 URL https://project.example.com/en/latest/_static/example.jpg
。请注意,上面 reST 示例中的图像路径是相对路径,因此 URL 不包含 auto_examples
,因为 ../
向上移动到文档源目录。支持相对路径和绝对路径(从源目录开始);因此,在上面的示例中,/_static/example.jpg
将导致生成相同的 URL。
请注意,前缀是直接应用的,因此如果需要,应在前缀中包含尾随的 /
。
提示
如果您在托管服务上构建了多个版本的文档并使用前缀,请考虑使用 sphinx build -D 命令行选项以确保链接指向正确的版本。例如
sphinx-build \
-b html \
-D sphinx_gallery_conf.notebook_images="https://project.example.com/docs/${VERSION}/" \
source_dir build_dir
使用 pypandoc 将 reST 转换为 markdown#
Sphinx-Gallery 可以使用 pypandoc(如果已安装)将 reST 文本块转换为 markdown,用于为每个示例生成的 iPython 笔记本 (.ipynb
文件)。这些文件可以下载,以及原始的 .py
版本,位于每个示例的底部。
Sphinx-Gallery reST 到 markdown 转换器对更复杂的 reST 语法支持有限。如果您的示例有更复杂的 reST,pypandoc
可能会产生更好的结果。默认情况下,‘pypandoc’ 配置设置为 False
,并且不会使用 pypandoc
。
要使用 pypandoc
,您可以设置
sphinx_gallery_conf = {
...
'pypandoc': True,
}
您也可以通过设置 pypandoc.convert_text()
参数 extra_args
和 filters
来使用 pandoc 选项。要使用这些参数,请将“pypandoc”配置设置为关键字参数的字典。
sphinx_gallery_conf = {
...
'pypandoc': {'extra_args': ['--mathjax',],
'filters': ['pandoc-citeproc',],
}
警告
某些 pandoc 选项可能会导致不良影响。请谨慎使用。
使用 JUnit XML 文件#
Sphinx-Gallery 可以创建您的示例运行时间、成功和失败的 JUnit XML 文件。要创建一个名为 junit-result.xml
的文件(例如在 /build
输出目录中),请设置配置键(路径相对于 HTML 输出目录)。
sphinx_gallery_conf = {
...
'junit': '../test-results/sphinx-gallery/junit.xml',
}
默认情况下,JUnit XML 文件生成被禁用(通过设置 'junit': ''
)。JUnit XML 文件在例如 CircleCI 构建中很有用,您可以在其中添加类似于以下内容的行,以在 CircleCI GUI 中获取示例运行时间的摘要(它将解析文件路径 doc/_build/test-results/sphinx-gallery/junit.xml
并根据嵌套的子目录名称推断测试来自 sphinx-gallery
)。
- store_test_results:
path: doc/_build/test-results
- store_artifacts:
path: doc/_build/test-results
有关 CircleCI 集成的更多信息,请查看相关的 CircleCI 文档 和 博客文章。
设置日志级别#
Sphinx-Gallery 在多个阶段记录输出。对于在不支持区分大小写命名的文件系统(例如 Windows)上构建文档时需要区分大小写的代码(例如 plt.subplot
和 plt.Subplot
),可能会生成警告。在这种情况下,默认情况下会发出 logger.warning
,这会导致在使用 -W
构建时构建失败。日志级别可以使用以下方式设置。
sphinx_gallery_conf = {
...
'log_level': {'backreference_missing': 'warning'},
}
目前唯一有效的键是 backreference_missing
。有效值为 'debug'
、'info'
、'warning'
和 'error'
。
选择缩略图图像#
对于生成多个图形的示例,默认行为将使用每个示例中创建的第一个图形作为显示在画廊中的缩略图图像。要将缩略图图像更改为示例脚本中稍后生成的图形,请在示例脚本中添加注释以指定要用作缩略图的图形编号。例如,要使用创建的第二个图形作为缩略图,请执行以下操作。
# sphinx_gallery_thumbnail_number = 2
您也可以使用负数,它从最后一个图形开始计数。例如,-1 表示使用示例中创建的最后一个图形作为缩略图。
# sphinx_gallery_thumbnail_number = -1
默认行为是 sphinx_gallery_thumbnail_number = 1
。有关此功能的示例,请参阅 选择缩略图图形。
提供缩略图图像的图像#
可以任意使用图像作为示例的缩略图图像。要指定要用作缩略图的图像,请在示例脚本中添加注释,指定所需图像的路径。图像路径应相对于 conf.py
文件,注释应位于文档字符串下方(最好是在代码块中,请参阅 删除配置注释)。
例如,以下定义了使用 _static/
文件夹中的 demo.png
图像来创建缩略图。
# sphinx_gallery_thumbnail_path = '_static/demo.png'
请注意,sphinx_gallery_thumbnail_number
会覆盖 sphinx_gallery_thumbnail_path
。有关此功能的示例,请参阅 提供缩略图图像的图形。
控制失败示例中的缩略图行为#
默认情况下,预期失败的示例的缩略图图像上会盖章“BROKEN”。此行为由 sphinx_gallery_failing_thumbnail
控制,默认情况下为 True
。在需要控制缩略图图像的情况下,应将其设置为 False
。这将使缩略图行为恢复到“正常”,即缩略图将是创建的第一个图形(或者如果未创建任何图形,则为 默认缩略图)或 提供的缩略图。
# sphinx_gallery_failing_thumbnail = False
比较 无法执行的示例(具有正常缩略图行为)(其中选项为 False
)和 无法执行的示例(其中选项为默认的 True
)的缩略图,以了解此功能的示例。
为画廊笔记本生成 Binder 链接(实验性)#
Sphinx-Gallery 会自动为使用画廊构建的所有示例生成 Jupyter 笔记本。Binder 使创建连接到云资源的交互式 GitHub 存储库成为可能。
如果您将文档托管在 GitHub 存储库中,则可以为每个笔记本自动生成一个 Binder 链接。单击此链接将带用户进入 Jupyter 笔记本的实时版本,他们可以在其中交互式地运行代码。有关更多信息,请参阅 Binder 文档。
警告
Binder 仍处于 beta 技术阶段,因此单击 Binder 链接的用户可能会遇到不稳定性。
为了在 Sphinx-Gallery 中启用 Binder 链接,您必须在 conf.py
中指定一些信息。这些信息作为嵌套字典给出,遵循以下模式。
sphinx_gallery_conf = {
...
'binder': {
# Required keys
'org': '<github_org>',
'repo': '<github_repo>',
'branch': '<github_branch>', # Can be any branch, tag, or commit hash. Use a branch that hosts your docs.
'binderhub_url': '<binder_url>', # Any URL of a binderhub deployment. Must be full URL (e.g. https://mybinder.org).
'dependencies': '<list_of_paths_to_dependency_files>',
# Optional keys
'filepath_prefix': '<prefix>' # A prefix to prepend to any filepaths in Binder links.
'notebooks_dir': '<notebooks-directory-name>' # Jupyter notebooks for Binder will be copied to this directory (relative to built documentation root).
'use_jupyter_lab': <bool> # Whether Binder links should start Jupyter Lab instead of the Jupyter Notebook interface.
}
}
如果发现用于 Binder 的 Sphinx-Gallery 配置,则将发生以下额外的事情。
在
dependencies
中指定的相关文件将被复制到构建文档中的binder/
文件夹中。来自文档的构建的 Jupyter 笔记本将被复制到构建文档根目录的
<notebooks_dir/>
文件夹中(它们将在笔记本目录文件夹中保留相同的文件夹层次结构)。每个 Sphinx-Gallery 示例的 reST 输出现在将包含一个
launch binder
按钮。该按钮将指向具有以下结构的 Binder 链接。
<binderhub_url>/v2/gh/<org>/<repo>/<ref>?filepath=<filepath_prefix>/<notebooks_dir>/path/to/notebook.ipynb
以下是每个字段的更完整解释。
- org(类型:字符串)
存储文档的 GitHub 组织。
- repo(类型:字符串)
存储文档的 GitHub 存储库。
- branch(类型:字符串)
对存储文档的存储库版本的引用。例如,如果您的构建文档存储在
gh-pages
分支上,则此字段应设置为gh-pages
。- binderhub_url(类型:字符串)
要运行示例的 BinderHub 部署的完整 URL。一个公共的 BinderHub 部署位于
https://mybinder.org
,但如果您(和您的用户)有权访问其他部署,则可以使用此字段进行配置。- dependencies(类型:列表)
相关文件路径的列表(相对于
conf.py
),Binder 使用这些路径来推断运行示例所需的 محیط。例如,一个requirements.txt
文件。这些文件将被复制到构建文档文件夹中的binder/
文件夹中。有关可以使用的所有可能相关文件列表,请参阅 Binder 配置文档。- filepath_prefix(类型:字符串 | None,默认值:
None
) 要附加到 Binder 链接中文件路径的前缀。如果您将构建文档存储在存储库的子文件夹中,而不是根目录中,则应使用此选项。
- notebooks_dir(类型:字符串,默认值:
notebooks
) 将构建的 Jupyter 笔记本复制到的文件夹的名称。这确保了所有笔记本都位于一个地方(尽管它们保留了其文件夹层次结构),以防您希望用户在一个会话中浏览多个笔记本示例。
- use_jupyter_lab(类型:布尔值,默认值:
False
) Binder 链接激活的默认界面是 Jupyter Lab 还是经典的 Jupyter Notebook 界面。
每个生成的 Jupyter 笔记本将被复制到 notebooks_dir
中指定的文件夹中。这将是 sphinx 输出目录的子文件夹,并包含在您的网站构建中。Binder 链接将指向这些笔记本。
注意
目前无法使用 readthedocs.org 托管由 Sphinx-Gallery 生成的笔记本,因为 RTD 不会为您提供可以将 Binder 链接到的 GitHub 存储库。如果您想将 readthedocs 与 Sphinx-Gallery 和 Binder 链接一起使用,您应该独立构建文档,并在 GitHub 分支上托管它,以及使用 readthedocs 构建它。
有关使用 公共 Binder 服务器 的示例,请参阅 Sphinx-Gallery Sphinx 配置文件。
为画廊笔记本生成 JupyterLite 链接(实验性)#
Sphinx-Gallery 会自动为画廊中使用到的任何示例生成 Jupyter 笔记本。 JupyterLite 允许您在浏览器中运行示例。其功能与 Binder 非常类似,您将获得一个 Jupyter 环境,可以在其中以交互式笔记本的形式运行示例。与 Binder 的主要区别在于
使用 JupyterLite,示例实际上是在您的浏览器中运行,无需在云中使用单独的机器来运行您的 Python 代码。这意味着启动 Jupyter 服务器通常更快,无需等待 Binder 镜像构建完成
使用 JupyterLite,第一次导入需要时间。截至撰写本文时 (2023 年 2 月),
import scipy
可能需要约 15-30 秒。一些看似无害的 Python 代码可能无法正常工作,并以意外的方式中断。Jupyter 内核基于 Pyodide,请查看 这里,了解 Pyodide 的一些限制。使用 JupyterLite,环境不如 Binder 灵活,例如您不能使用 Docker 镜像,只能使用默认的 Pyodide 环境。这意味着某些非纯 Python 包可能不可用,请查看 Pyodide 中的可用包列表。
警告
JupyterLite 仍然处于测试阶段,其成熟度低于 Binder,因此,点击 JupyterLite 链接的用户可能会遇到不稳定或意外行为。
为了使用 Sphinx-Gallery 启用 JupyterLite 链接,您需要安装 jupyterlite-sphinx 包。对于 jupyterlite-sphinx>=0.8(于 2023 年 3 月 15 日发布),您还需要安装 jupyterlite-pyodide-kernel。
然后,您需要将 jupyterlite_sphinx 添加到 conf.py
中的 Sphinx 扩展。
extensions = [
...,
'jupyterlite_sphinx',
]
您可以在 conf.py
中通过设置 sphinx_gallery_conf['jupyterlite']
来配置 JupyterLite 集成,如下所示
sphinx_gallery_conf = {
...
'jupyterlite': {
'use_jupyter_lab': <bool>, # Whether JupyterLite links should start Jupyter Lab instead of the Retrolab Notebook interface.
'notebook_modification_function': <str>, # fully qualified name of a function that implements JupyterLite-specific modifications of notebooks
'jupyterlite_contents': <str>, # where to copy the example notebooks (relative to Sphinx source directory)
}
}
以下是每个字段的更完整解释。
- use_jupyter_lab (类型:bool,默认值:
True
) JupyterLite 链接激活的默认界面是 Jupyter Lab 还是 RetroLab Notebook 界面。
- notebook_modification_function (类型:str,默认值:
None
) 实现 JupyterLite 特定笔记本修改的函数的完全限定名称。默认情况下,它为
None
,这意味着笔记本将不会被修改。其签名应为notebook_modification_function(json_dict: dict, notebook_filename: str) -> None
,其中json_dict
是执行json.load(open(notebook_filename))
时获得的值。该函数应通过添加笔记本单元格来就地修改json_dict
。它不应该写入文件,因为sphinx-gallery
负责此操作。notebook_filename
用于方便起见,因为它有助于根据文件名修改笔记本。此函数的潜在用途包括使用%pip install seaborn
代码单元格安装其他包,或添加 Markdown 单元格以指示笔记本预计不会在 JupyterLite 中运行,例如因为它使用的是 Pyodide 中没有打包的包。为了向后兼容性,它也可以是可调用对象,但不会被 Sphinx 作为环境的一部分正确缓存。- jupyterlite_contents (类型:string,默认值:
jupyterlite_contents
) 构建的 Jupyter 笔记本将被复制到的文件夹的名称,相对于 Sphinx 源目录。它用作 Jupyterlite 内容。
您可以在 conf.py
中设置变量以配置 jupyterlite-sphinx
,有关更多详细信息,请参阅 jupyterlite-sphinx 文档。
如果发现用于 JupyterLite 的 Sphinx-Gallery 配置,则会发生以下额外操作
使用一些合理的默认值配置
jupyterlite-sphinx
,例如设置jupyterlite_bind_ipynb_suffix = False
。文档中构建的 Jupyter 笔记本将被复制到名为
<jupyterlite_contents>/
的文件夹(相对于 Sphinx 源目录)如果
notebook_modification_function
不是None
,则此函数将为笔记本添加 JupyterLite 特定修改每个 Sphinx-Gallery 示例的 reST 输出现在将包含一个
launch JupyterLite
按钮。该按钮将指向一个 JupyterLite 链接,该链接将在您的浏览器中启动一个 Jupyter 服务器,并以当前示例作为笔记本。
如果出于某种原因,您要启用 jupyterlite-sphinx
扩展但不想使用 Sphinx-Gallery Jupyterlite 集成,则可以执行以下操作
extensions = [
...,
jupyterlite_sphinx,
]
sphinx_gallery_conf = {
...
'jupyterlite': None
}
请参阅 Sphinx-Gallery 的 Sphinx 配置文件,以获取使用 JupyterLite 集成的示例。
控制笔记本下载链接#
默认情况下,仅针对 Python 示例显示下载 Jupyter 笔记本以及启动 Binder 或 JupyterLite(如果已启用)的链接。如果已启用解析其他文件扩展名(使用 example_extensions
选项;请参阅 通过匹配模式解析和执行示例),则可以使用 notebook_extensions
选项启用笔记本下载。例如
sphinx_gallery_conf = {
"notebook_extensions": {".py", ".jl"}
}
其中列出的扩展名将与画廊目录中的文件名进行比较。
注意
目前,所有生成的笔记本都将 Python 指定为内核。下载后,用户需要手动更改为正确的内核。
使笔记本中的单元格魔法可执行#
教程中通常会包含用户需要复制/粘贴到终端中的 bash 代码。构建文档时不应运行此代码,因为用户已经在其环境中安装了这些依赖项。因此,它们通常作为文本内的代码块编写
#%%
# Installing dependencies
#
# .. code-block:: bash
#
# pip install -q tensorflow
# apt-get -qq install curl
这对于 .py
和 .html
文件效果很好,但在渲染为 Jupyter 笔记本时会导致问题。下载的 .ipynb
文件将没有安装这些依赖项,并且在运行 bash 代码之前将无法正常工作。
为了解决此问题,我们可以在 conf.py
中设置 promote_jupyter_magic
标志
sphinx_gallery_conf = {
...
'promote_jupyter_magic': True,
}
如果此标志为 True
,那么在构建 Jupyter 笔记本时,任何以 Jupyter 单元格魔法(例如 %%bash
或 %%writefile
)开头的代码块将被转换为可运行的代码块。
对于我们之前的示例,我们可以将 Markdown 文本更改为
#%%
# Installing dependencies
#
# .. code-block:: bash
#
# %%bash
# pip install -q tensorflow
# apt-get -qq install curl
这意味着 TensorFlow 和 Curl 将在运行 Jupyter 笔记本时自动安装。这适用于任何单元格魔法(不只是上面提到的那些),并且仅影响 Jupyter 笔记本的创建。
警告
最佳实践是确保 .py
和 .html
文件尽可能与 .ipynb
文件匹配。此功能应仅在相关代码旨在由最终用户执行时使用。
在不执行示例的情况下构建#
Sphinx-Gallery 可以解析所有示例并构建画廊,而无需执行任何脚本。这仅用于加快画廊的可视化过程以及它占用网站显示的空间大小,或者您能想到的任何用途。为此,您需要在构建过程中传递 no plot 选项,方法是修改 Makefile
,方法如下
html-noplot:
$(SPHINXBUILD) -D plot_gallery=0 -b html $(ALLSPHINXOPTS) $(SOURCEDIR) $(BUILDDIR)/html
@echo
@echo "Build finished. The HTML pages are in $(BUILDDIR)/html."
请记住,对于 Makefile
,空格很重要,缩进使用的是制表符,而不是空格。
或者,您可以将 plot_gallery
选项添加到 conf.py
中的 sphinx_gallery_conf
字典中,将其设置为默认值
sphinx_gallery_conf = {
...
'plot_gallery': 'False',
}
-D 标志的优先级始终最高 sphinx-build
命令。
注意
如果将 html-noplot
添加到 Makefile
中,您还需要在 conf.py
文件中的 sphinx_gallery_conf
字典中显式设置 plot_gallery
的默认值,以避免出现 Sphinx 配置警告。
压缩图像#
在编写 PNG 文件(默认的抓取器格式)时,可以配置 Sphinx-Gallery 以使用 optipng
来优化 PNG 文件的大小。通常,这会使文件大小减少约 50%,从而减少画廊的加载时间。但是,这会增加构建时间。允许的值为 'images'
和 'thumbnails'
,或者元组/列表(优化两者),例如
sphinx_gallery_conf = {
...
'compress_images': ('images', 'thumbnails'),
}
默认值为 ()
(不优化),如果请求优化但 optipng
不可用,则会发出警告。您还可以传递其他命令行选项(以 '-'
开头),例如,为了减少优化但加快构建时间,您可以执行以下操作
sphinx_gallery_conf = {
...
'compress_images': ('images', 'thumbnails', '-o1'),
}
有关完整选项列表,请参阅 $ optipng --help
。
多分辨率图像#
Web 浏览器允许在 <img>
标签中使用 srcset
参数,使浏览器支持 响应式分辨率图像,以适应高分辨率/视网膜显示屏。Sphinx Gallery 通过 image_srcset
参数支持此功能。
sphinx_gallery_conf = {
...
'image_srcset': ["2x"],
}
它会保存一个以正常图像 dpi(通常为 100 dpi)生成的 1x 图像,以及一个以两倍密度(例如 200 dpi)生成的 2x 版本。默认情况下不生成额外的图像 ('image_srcset': []
),您也可以根据需要将其他分辨率指定为列表:["2x", "1.5x"]
。
Matplotlib 刮取程序会在 rst 文件中创建一个自定义图像指令,即 image-sg
.. image-sg:: /examples/images/sphx_glr_test_001.png
:alt: test
:srcset: /examples/images/sphx_glr_test_001.png, /examples/images/sphx_glr_test_001_2_0x.png 2.0x
:class: sphx-glr-single-img
此指令由自定义指令转换为 html,如下所示:
.. <img src="../_images/sphx_glr_test_001.png" alt="test", class="sphx-glr-single-img",
srcset="../_images/sphx_glr_test_001.png, ../_images/sphx_glr_test_001_2_0x.png 2.0x>
这会导致网站变大,但支持 srcset
标签的客户端只会下载相应尺寸的图像。
请注意,.. image-sg
指令目前会忽略其他 .. image
指令标签,例如 width
、height
和 align
。它只适用于 html 和 latex 生成器。
图像刮取程序#
图像刮取程序是 Sphinx-Gallery 的插件,允许它检测在执行示例期间产生的图像,并将它们嵌入到文档中。可以通过在 Sphinx-Gallery 配置中的 'image_scrapers'
元组中添加刮取程序名称来激活刮取程序。例如,要刮取 Matplotlib 图像,您可以执行以下操作:
sphinx_gallery_conf = {
...
'image_scrapers': ('matplotlib',),
}
默认值为 'image_scrapers': ('matplotlib',)
,它只刮取 Matplotlib 图像。请注意,这包括由基于 Matplotlib 的软件包(例如 Seaborn 或 Yellowbrick)生成的任何图像。
Matplotlib 动画#
如果您希望将 matplotlib.animation.Animation
作为动画嵌入,而不是动画图形的单个静态图像,则应使用 matplotlib_animations 配置。它接受一个布尔值(指示是否应启用动画),或一个格式为 (enabled: bool, format: str) 的元组。
sphinx_gallery_conf = {
...
'matplotlib_animations': (True, 'mp4'),
}
matplotlib_animations 默认情况下为 False。
任何 Matplotlib 支持的动画文件格式都是允许的。如果没有指定格式(即它是一个布尔值),或者它为 None,则格式由 rcParams['animation.html']
和您 matplotlib rcParams 中的相关选项确定。这意味着它可以在您的代码块中设置,但请注意,Sphinx-Gallery 会在每个示例文件执行之前重置 Matplotib 默认值(参见 重置模块)。
如果格式为 'html5'
或 'jshtml'
,动画将有效地嵌入到生成的 HTML 文件中。否则,动画将保存在外部文件中,从而减少生成的 ReST 文件的大小。如果您请求保存到外部文件的格式,则需要在您的环境中安装 sphinxcontrib-video 扩展。
请注意,虽然 matplotlib_animations
允许您全局设置 rcParams['animation.html']
,但在代码块中设置它将覆盖全局设置。
还建议确保“FFmpeg”或“imagemagick”可用作 writer
。使用 matplotlib.animation.ImageMagickWriter.isAvailable()
或 matplotlib.animation.FFMpegWriter.isAvailable()
检查。我们建议使用 FFMpeg 编写器,除非您使用的是 Matplotlib <3.3.1。
支持以下刮取程序:
- matplotlib
Sphinx-Gallery 通过字符串
'matplotlib'
为matplotlib
图形维护一个刮取程序。
- PyVista
PyVista 通过字符串
'pyvista'
维护一个刮取程序(适用于 PyVista >= 0.20.3)。
- PyGMT
有关如何与 Sphinx-Gallery 集成的更多信息,请参见 他们的网站。
- qtgallery
该库提供了一个用于 Qt 窗口的刮取程序。有关如何与 Sphinx-Gallery 集成的说明,请参见 他们的存储库。
可以为在上面列出的软件包之外生成的图像编写自定义刮取程序。这可以通过编写您自己的 Python 函数来实现,该函数定义如何检测和检索由任意软件包生成的图像。有关说明,请参见 编写自定义图像刮取程序。如果您想出一种对一般用途有用的实现(例如,一个用于绘图库的自定义刮取程序),请随时将其添加到上面的列表中(参见讨论 此处)!
使用多个代码块创建单个图形#
默认情况下,图像是在示例中的每个代码块之后刮取的。因此,以下操作将生成两个图形,每个代码块一个图形:
# %%
# This first code block produces a plot with two lines
import matplotlib.pyplot as plt
plt.plot([1, 0])
plt.plot([0, 1])
# %%
# This second code block produces a plot with one line
plt.plot([2, 2])
plt.show()
但是,有时使用多个代码块来创建单个图形可能很有用,尤其是在图形需要大量命令,并且这些命令需要与文本块交错排列时。可选标志 sphinx_gallery_defer_figures
可以作为注释插入代码块中的任何位置,以将图像刮取推迟到下一个代码块(如果需要,可以进一步推迟)。以下操作只生成一个图形:
# %%
# This first code block does not produce any plot
import matplotlib.pyplot as plt
plt.plot([1, 0])
plt.plot([0, 1])
# sphinx_gallery_defer_figures
# %%
# This second code block produces a plot with three lines
plt.plot([2, 2])
plt.show()
控制从同一个代码块生成的多个图形的布局#
默认情况下,从同一个代码块生成的多个图形将并排堆叠。对于宽图形来说,这会导致图像被高度缩小,从而降低其可读性。可以使用两个可选变量来控制这种行为:
一个文件级的
sphinx_gallery_multi_image
变量一个代码块级的
sphinx_gallery_multi_image_block
变量
默认行为是将这些变量设置为 "multi"
,这会导致图形并排堆叠。将这些变量设置为 "single"
将允许从代码块生成的图形以单列显示。
例如,添加以下内容:
# sphinx_gallery_multi_image = "single"
在示例文件中,将导致所有产生多个图形的代码块中的图像以单列显示。
或者,将以下内容添加到代码块中:
# sphinx_gallery_multi_image_block = "single"
将导致只有该代码块中的多个图形以单列显示。
相反,如果为整个文件设置了 sphinx_gallery_multi_image = "single"
,添加 sphinx_gallery_multi_image_block = "multi"
可以为单个代码块恢复默认行为。
有关此功能的演示,请参见示例 强制将图形显示在单独的行上。
隐藏代码行#
通常,Sphinx-Gallery 在构建 HTML 和 iPython 笔记本时会渲染 Python 代码的每一行。这通常是可取的,因为我们希望确保 Python 源文件、HTML 和 iPython 笔记本都执行相同的操作。
但是,有时使用运行但不包含在任何面向用户的文档中的 Python 代码可能很有用。例如,假设我们要添加一些 assert
语句来验证文档是否已成功构建,但不想将其显示给用户。我们可以使用 sphinx_gallery_start_ignore
和 sphinx_gallery_end_ignore
标志来实现这一点:
model.compile()
# sphinx_gallery_start_ignore
assert len(model.layers) == 5
assert model.count_params() == 219058
# sphinx_gallery_end_ignore
model.fit()
构建 HTML 或 iPython 笔记本时,此代码块将显示为:
model.compile()
model.fit()
sphinx_gallery_start_ignore
和 sphinx_gallery_end_ignore
标志可以在任何代码块中使用,同一个代码块中可以使用多个标志对。每个开始标志都必须始终有一个相应的结束标志,否则在文档生成期间将引发错误。这些标志以及它们之间的代码将始终被删除,无论 remove_config_comments
设置为何值。
请注意,忽略代码的任何输出仍将被捕获。
警告
此标志应谨慎使用,因为它会使 .py
源文件与生成的 .html
和 .ipynb
文件不那么等效。当可以使用其他保留这种关系的方法时,使用此方法是错误的做法。
生成虚拟图像#
为了快速可视化您的画廊,尤其是在编写过程中,Sphinx-Gallery 允许您在不执行代码的情况下构建画廊(参见 在不执行示例的情况下构建 和 文件名/忽略模式)。但是,如果您手动编写了指向自动生成的图像的链接,这可能会导致有关缺少图像文件的警告。为了防止这些警告,您可以告诉 Sphinx-Gallery 为示例创建一些虚拟图像。
例如,您可能有一个示例(“my_example.py”)生成 2 个图形,然后您在其他地方手动引用它们,例如:
Below is a great figure:
.. figure:: ../auto_examples/images/sphx_glr_my_example_001.png
Here is another one:
.. figure:: ../auto_examples/images/sphx_glr_my_example_002.png
为了防止在不执行的情况下构建时出现缺少图像文件的警告,您可以在示例文件中添加以下内容:
# sphinx_gallery_dummy_images=2
这将导致 Sphinx-Gallery 生成 2 个虚拟图像,它们具有相同的命名约定,并存储在与执行时生成图像相同的位置。如果存在现有图像(例如,来自之前的构建运行),则不会生成任何虚拟图像,因此它们不会被覆盖。
注意
此配置**仅**在示例设置为不执行时有效(即,plot_gallery
为 'False'
,示例在 ignore_pattern 中或示例不在 filename_pattern
中 - 参见 文件名/忽略模式)。这意味着当您切换到使用执行构建画廊时,您不需要从示例中删除任何 sphinx_gallery_dummy_images
行。
重置模块#
通常,您希望“重置”可视化包的行为,以确保对一个示例中的绘图行为所做的任何更改都不会传播到其他示例。
默认情况下,在每个示例文件执行之前,Sphinx-Gallery 将重置 matplotlib
(通过使用 matplotlib.pyplot.rcdefaults()
并重新加载填充单位注册表的子模块)和 seaborn
(通过尝试从 sys.modules
中卸载模块)。这等效于以下配置:
sphinx_gallery_conf = {
...
'reset_modules': ('matplotlib', 'seaborn'),
}
目前,Sphinx-Gallery 本地支持重置 matplotlib
和 seaborn
。但是,您也可以将自己的自定义函数添加到此元组中,以定义其他可视化库的重置行为。
为此,请按照 在每个示例之前重置 中的说明进行操作。
重置模块的顺序#
默认情况下,Sphinx-Gallery 将在运行每个示例之前重置模块。reset_modules_order
的选择是 before
(默认)、after
和 both
。如果 Sphinx-Gallery 中运行的最后一个示例修改了模块,建议使用 after
或 both
以避免将修改后的模块泄漏到 Sphinx 构建过程的其他部分。例如,在配置中将 reset_modules_order
设置为 both
sphinx_gallery_conf = {
...
'reset_modules_order': 'both',
}
可以构建自定义函数,以便根据它们是在示例之前还是之后调用来具有自定义功能。有关更多信息,请参见 在每个示例之前重置。
处理失败的画廊示例脚本#
随着项目的不断发展,一些示例脚本可能无法正常执行。Sphinx-Gallery 将帮助您发现这些有问题的示例。默认行为是在画廊中将这些示例的缩略图替换为损坏的缩略图。这使您可以快速浏览画廊,找出哪些示例失败了。损坏的示例在画廊的 html 视图中仍然可以访问,并且回溯消息将写入失败的代码块。请参阅示例 无法执行的示例 以查看默认行为。
构建也会失败,退出代码为 1,并向您提供失败示例及其各自回溯的摘要。这样,您就可以在构建后立即了解失败的示例,并可以轻松地找到它们。
您还可以使用一些其他选项来处理损坏的示例。
在第一次失败时中止构建#
Sphinx-Gallery 提供了提前失败选项。在此模式下,一旦示例脚本执行中出现异常,画廊构建过程就会中断。要激活此行为,您需要在构建过程中传递一个标志。可以通过在您的 Makefile
中包含以下内容来实现
html_abort_on_example_error:
$(SPHINXBUILD) -D abort_on_example_error=1 -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html
@echo
@echo "Build finished. The HTML pages are in $(BUILDDIR)/html."
请记住,对于 Makefile
,空格很重要,缩进使用的是制表符,而不是空格。
或者,您可以在 conf.py
配置文件中的 sphinx_gallery_conf
字典中添加 abort_on_example_error
选项,使其成为默认值
sphinx_gallery_conf = {
...
'abort_on_example_error': True,
}
-D 标志的优先级始终最高 sphinx-build
命令。
如果特定示例出现错误,则不要失败构建#
您可能希望即使有失败的示例也要保留画廊。因此,您可以配置 Sphinx-Gallery 允许某些示例失败,但仍以 0 退出代码退出。为此,您需要列出您想要允许在构建过程中失败的所有示例。相应地更改您的 conf.py
sphinx_gallery_conf = {
...
'expected_failing_examples': ['../examples/plot_raise.py']
}
在这里,您列出了您允许在构建过程中失败的示例,请记住指定从您的 conf.py 到示例脚本的完整相对路径。
注意
如果预计示例会失败,而 Sphinx-Gallery 在示例运行没有错误的情况下会报错。
不要在错误时失败构建#
可以配置 Sphinx-Gallery,当示例失败时只记录警告。这意味着 sphinx 只有在向 sphinx-build
传递了 -W
标志时才会以非零退出代码退出。可以通过设置以下内容来启用此功能
sphinx_gallery_conf = {
...
'only_warn_on_example_error': True
}
并行构建示例#
可以配置 Sphinx-Gallery 使用 joblib
同时运行示例。可以通过设置以下内容来启用此功能
sphinx_gallery_conf = {
...
'parallel': 2,
}
如果为 int
,则将该数量的作业传递给 joblib.Parallel
。如果为 True
,则将使用与 Sphinx 的 -j
标志相同数量的作业。
在文档构建过程中由 joblib
发出的警告(例如,有关 工作进程重新启动 的 UserWarning
)在画廊生成期间与示例代码执行的警告同时发出。这些可以使用 warnings.filterwarnings
过滤掉(参见 删除警告)。如果您在文档构建中调整了警告处理以将警告视为错误(例如,使用类似 warnings.filterwarnings("error)
的行将所有警告转换为错误),那么这样做尤其重要。在这种情况下,如果 joblib 在示例构建过程中发出警告,则此示例将意外失败,除非它们被过滤掉。请注意,这与受 - W
/ --fail-on-warning
sphinx-build
标志影响的警告不同,该标志将文档构建期间的 Sphinx 警告转换为错误。
警告
某些包可能无法与并行处理配合使用,因此此功能被认为是**实验性的**!
例如,您可能需要在一个 自定义重置器 中设置变量或调用函数,以确保所有生成的进程都正确设置并拆卸。并行性是通过 joblib 的 Loky 后端实现的,有关许多相关考虑因素(例如,pickle、CPU 资源过度订阅等)的文档,请参见 令人尴尬的并行 for 循环。
使用并行构建也会禁用内存测量。
启用示例推荐系统#
可以配置 Sphinx-Gallery 为示例画廊生成基于内容的推荐。通过计算其文本内容在 TF-IDF 空间中的最接近示例,会自动生成相关示例列表。只有单个画廊(包括其子画廊)中的示例用于计算最接近的示例。然后,最相似的内容将在每个示例的底部显示为一组缩略图。
可以通过将 enable
设置为 True
来启用推荐系统。要配置它,请将字典传递给 sphinx_gallery_conf
,例如
sphinx_gallery_conf = {
...
"recommender": {"enable": True, "n_examples": 5, "min_df": 3, "max_df": 0.9},
}
唯一必需的参数是 enable
。如果任何其他参数未指定,则使用默认值。以下是每个字段的更完整解释
- enable(类型:bool,默认值:False)
是否在示例画廊中生成推荐。启用此功能需要将 numpy 添加到依赖项中。
- n_examples(类型:int,默认值:5)
要显示的最相关示例的数量。
- min_df(类型:范围 [0.0, 1.0] 中的 float | int,默认值:3)
在构建词汇表时,忽略文档频率严格低于给定阈值的术语。如果为 float,则参数表示文档的比例,整数表示绝对计数。此值在文献中也被称为截止值。
- max_df(类型:范围 [0.0, 1.0] 中的 float | int,默认值:0.9)
在构建词汇表时,忽略文档频率严格高于给定阈值的术语。如果为 float,则参数表示文档的比例,整数表示绝对计数。
- rubric_header(类型:str,默认值:“Related examples”)
可定制的评分规则标题。它可以编辑为更具描述性的文本或添加外部链接,例如指向 Sphinx-Gallery 文档中推荐系统 API 文档的链接。
参数 min_df
和 max_df
可以由用户自定义,以修剪非常罕见/非常常见的词语。这可能会提高推荐的质量,但更重要的是,它节省了一些在非信息性标记上浪费的计算资源。
目前,示例推荐仅针对 .py
文件计算。
设置图库缩略图大小#
默认情况下,Sphinx-Gallery 会以 (400, 280)
的大小生成缩略图。然后,缩略图将按 thumbnail_size
指定的大小进行缩放,根据需要添加柱形框或字幕框以保持原始纵横比。默认的 thumbnail_size
是 (400, 280)
(不缩放),可以通过 thumbnail_size
配置进行更改,例如
sphinx_gallery_conf = {
...
'thumbnail_size': (250, 250),
}
图库使用各种 CSS 类来显示这些缩略图,默认情况下最大为 160x112px。要更改此设置,可以通过 Sphinx 配置 html_static_path
(它将覆盖 Sphinx-Gallery CSS 文件 中的默认 CSS 类)包含您自己的 CSS 文件。以下 CSS 将以 250x250px 而不是默认的 160x112px 显示图像。
.sphx-glr-thumbcontainer {
min-height: 320px !important;
margin: 20px !important;
}
.sphx-glr-thumbcontainer .figure {
width: 250px !important;
}
.sphx-glr-thumbcontainer img {
max-height: 250px !important;
width: 250px !important;
}
.sphx-glr-thumbcontainer a.internal {
padding: 270px 10px 0 !important;
}
注意
在版本 0.9.0 中,thumbnail_size
的默认值将从 (400, 280)
(CSS 指定的最大值的 2.5 倍)更改为 (320, 224)
(CSS 指定的最大值的 2 倍)。这是为了防止不必要的过采样。
最小报告时间#
默认情况下,Sphinx-Gallery 会记录并在 html 输出中嵌入运行每个脚本所需的时间。如果您的大多数示例运行速度很快,您可能不需要此信息。
参数 min_reported_time
可以设置为秒数。运行时间短于该值的脚本的持续时间将不会被记录,也不会嵌入到 html 输出中。
写入计算时间#
如果您要从所有图库输出中省略计算时间,请将其设置为 False
。这有助于实现可重现的构建。默认值为 True
,除非设置了 SOURCE_DATE_EPOCH
环境变量。
显示内存消耗#
如果安装了 memory_profiler
,Sphinx-Gallery 可以使用它来报告示例运行期间的峰值内存。安装 memory_profiler
后,您可以执行
sphinx_gallery_conf = {
...
'show_memory': True,
}
也可以使用您自己的自定义内存报告器,例如,如果您更想查看 GPU 内存。在这种情况下,show_memory
必须是一个可调用对象,它接受一个要调用的函数(即内部生成的用于运行单个脚本代码块的函数),并返回包含以下两个元素的元组:
运行函数时使用的内存(以 MiB 为单位),以及
函数的输出
始终报告 0 内存使用量的版本如下所示
sphinx_gallery_conf = {
...
'show_memory': lambda func: (0., func()),
}
显示签名#
默认情况下,Sphinx-Gallery 会在生成的输出中写入 Generated by … 通知。
参数 show_signature
可以用来禁用它。
控制捕获哪些输出#
注意
将 capture_repr
配置为一个空元组(即 capture_repr: ())以返回到 v0.5.0 版本之前的输出捕获行为。
配置 capture_repr
允许用户控制在执行示例 .py
文件时捕获哪些输出,以及随后将其整合到构建的文档中。定向到标准输出的数据始终会被捕获。每个代码块的最后一个语句的值(如果它是表达式)也可以被捕获。这可以通过在 capture_repr
元组中按优先级顺序提供要捕获的“表示”方法的名称来实现。当前支持的表示方法有
__repr__
- 返回对象的官方字符串表示形式。这是 Python shell 在计算表达式时返回的值。__str__
- 返回包含对象的易于打印表示形式的字符串。当您print()
对象或将其传递给format()
时,就会使用它。_repr_html_
- 返回对象的 HTML 版本。此方法仅存在于某些对象中,例如,pandas 数据帧。
输出捕获可以通过全局 capture_repr
配置设置来控制,也可以通过在示例文件添加注释来逐文件控制,这会覆盖任何全局设置
# sphinx_gallery_capture_repr = ()
默认设置是
sphinx_gallery_conf = {
...
'capture_repr': ('_repr_html_', '__repr__'),
}
使用默认设置,Sphinx-Gallery 会首先尝试捕获代码块中最后一个语句的 _repr_html_
(如果它是表达式)。如果表达式不存在此方法,则会捕获元组中的第二个“表示”方法 __repr__
。如果 __repr__
也不存在(对于非用户定义的对象来说不太可能),则不会捕获任何内容。定向到标准输出的数据将始终被捕获。有关一些示例,请参阅 捕获输出表示形式.
要仅捕获定向到标准输出的数据,请将 'capture_repr'
配置为一个空元组:'capture_repr': ()
。这将模仿 v0.5.0 之前的 Sphinx-Gallery 的行为。
从另一个角度来看,以以下代码块为例
print('Hello world')
a=2
a # this is an expression
'Hello world'
将针对所有 capture_repr
设置进行捕获,因为这会定向到标准输出。此外,
如果
capture_repr
是一个空元组,则不会捕获任何其他内容。如果
capture_repr
是('__repr__')
,则还会捕获2
。如果
capture_repr
是('_repr_html_', '__repr__')
(默认设置),Sphinx-Gallery 会首先尝试捕获_repr_html_
。由于a
不存在此方法,因此它会尝试捕获__repr__
。方法__repr__
存在于a
中,因此在这种情况下,2
也会被捕获。
Matplotlib 注意:如果 'capture_repr'
元组包含 '__repr__'
和/或 '__str__'
,将 Matplotlib 函数调用作为最后一个表达式的代码块通常会在构建的文档中生成一个黄色的输出框,以及图形。这是因为 matplotlib 函数调用通常会返回一些内容,并创建/修改标准输出中的绘图。例如,matplotlib.plot()
会返回一个 Line2D
对象列表,表示已绘制的数据。此列表具有 __repr__
和 __str__
方法,因此将被捕获。您可以通过以下方式防止这种情况
将(最后一个)绘图函数分配给一个临时变量。例如
import matplotlib.pyplot as plt _ = plt.plot([1, 2, 3, 4], [1, 4, 9, 16])
在代码块的末尾添加
plt.show()
(它不返回任何内容)。例如import matplotlib.pyplot as plt plt.plot([1, 2, 3, 4], [1, 4, 9, 16]) plt.show()
如果 'capture_repr'
是一个空元组,或者不包含 __repr__
或 __str__
,则不会出现不必要的字符串输出。
防止捕获某些类#
如果您希望捕获每个代码块最后一个表达式的表示形式,除非最后一个表达式是某种特定类型,则可以使用 'ignore_repr_types'
。默认情况下,'ignore_repr_types'
是一个空原始字符串 (r''
),这意味着不忽略任何类型。要排除特定类型(s)不进行捕获,可以将 'ignore_repr_types'
设置为与要排除的类型(s)的名称相匹配的正则表达式。
例如,以下配置将捕获每个代码块最后一个表达式的 __repr__
,除非最后一个表达式的 type()
的名称包含字符串“matplotlib.text”或“matplotlib.axes”。这将防止捕获所有“matplotlib.text”的子类,例如类型为“matplotlib.text.Annotation”、“matplotlib.text.OffsetFrom”等的表达式。同样,“matplotlib.axes”的子类(例如“matplotlib.axes.Axes”、“matplotlib.axes.Axes.plot”等)也不会被捕获。
sphinx_gallery_conf = {
...
'capture_repr': ('__repr__'),
'ignore_repr_types': r'matplotlib\.(text|axes)',
}
嵌套图库部分#
nested_sections
允许您控制在 gallery 具有子部分(examples_dirs 内的子文件夹,也称为子图库)时,如何生成图库 index.rst
文件。这对控制侧边栏外观很有用。默认情况下,设置为 nested_sections=True
,因为它通常与流行的 pydata-sphinx-theme 主题一起使用。但是,它可能会在其他主题的侧边栏中造成不必要的重复,因此建议用户为其主题选择最合适的 nested_sections
设置。
默认情况下,nested_sections=True
,Sphinx-Gallery 将使用 GALLERY_HEADER.[ext]
(或为了向后兼容的 README.[ext]
)文件,为父画廊和每个子部分构建单独的索引文件。子部分索引文件将包含子部分的标题(来自 GALLERY_HEADER.[ext]
文件)和一个链接到子部分中每个画廊示例的 toctree。父画廊的主 index.rst
文件将依次包含
父画廊标题后跟画廊缩略图,
一个链接到父画廊中每个画廊示例的 toctree,
子部分标题后跟子部分缩略图,适用于所有子部分,
第二个 toctree,位于文件末尾,链接到所有子部分索引文件。
生成的文件夹结构和 toctrees 模仿了父画廊文件夹,这可能需要为某些主题生成带有嵌套部分的侧边栏。
对于其他主题,拥有两个 toctrees 可能会导致侧边栏中出现不必要的重复。在这种情况下,您可以尝试将所有父画廊示例移动到它们自己的子文件夹中,因为这将导致父画廊 index.rst
中只有一个 toctree,或者使用 nested_sections=False
。
nested_sections=False
使 Sphinx-Gallery 的行为与 0.10.2 版本之前的版本一致。具体来说,它将为整个画廊生成一个索引文件。此索引文件将包含父画廊和每个子部分的标题,每个标题后跟一个链接到父画廊/子部分中每个示例的 toctree。对于某些主题,使用这些 toctrees 生成的侧边栏将以扁平结构列出所有画廊项目,而不是反映子画廊的嵌套文件夹结构。
手动传递文件#
默认情况下,Sphinx-Gallery 会创建所有写入 sphinx-build 目录的文件,无论是通过从画廊源代码中的 *.py
生成 rst 和图像,还是通过从画廊源代码中的 GALLERY_HEADER.rst
(或为了向后兼容的 README.[rst/txt]
)创建 index.rst
。但是,有时将文件从画廊源代码传递到 sphinx-build 非常有用。例如,您可能想要传递画廊引用的图像,但没有自行生成。您可能还想要将原始 rst 从画廊源代码传递到 sphinx-build,因为该材料在主题上与您的画廊相符,但更容易写成 rst。为了适应这一点,您可以在 sphinx_gallery_conf
中设置 copyfile_regex
。以下代码将复制所有 rst 文件。
sphinx_gallery_conf = {
...
'copyfile_regex': r'.*\.rst',
}
请注意,如果您复制了 rst 文件,例如,您有责任确保它们位于您的文档中的某个地方的 sphinx toctree
中。当然,您可以在您的 GALLERY_HEADER.rst
中添加一个 toctree
。
手动传递 index.rst
#
您可以绕过 Sphinx-Gallery 自动从画廊目录或嵌套的子画廊目录中的 GALLERY_HEADER.rst
创建 index.rst
。如果您的 copyfile_regex
包含 index.rst
,并且您在画廊源代码(即 examples_dirs 目录)中有一个 index.rst
,Sphinx-Gallery 将使用它,而不是为该画廊或其任何子画廊创建索引文件。如果您传递自己的 index.rst
文件,您有责任在该索引(或您 Sphinx 文档中的其他位置)添加自己的 Sphinx toctree
,该索引包含该目录中的任何画廊项目或其他文件。您还负责添加该画廊的子画廊所需的任何 index.rst
文件。
显示 API 用法#
未使用 API 条目和每个 API 条目使用的示例的图表和文档将在 sphinx 输出目录中的 sg_api_usage.html
下生成。有关示例,请参见 Sphinx-Gallery API 使用文档和图表。在大型项目中,有很多模块,并且由于每个模块都生成了一个 API 使用图表,因此这会使用大量的资源,因此 show_api_usage
默认设置为 'unused'
。所有未使用的 API 条目都显示在一个图表中,因此这对于大型项目来说可以更好地扩展。将 show_api_usage
设置为 True
将为每个模块创建一个图表,显示所有与它们使用的示例相连的 API 条目。这可能有助于创建一个地图,说明如果您想了解特定模块,应该查看哪些示例。将 show_api_usage
设置为 False
不会创建任何关于 API 用法的图表或文档。请注意,创建未使用和已使用 API 条目图表需要 graphviz
。
忽略 API 条目#
默认情况下,api_usage_ignore='.*__.*__'
在记录和绘制示例画廊中 API 条目的使用情况时,会忽略与该正则表达式匹配的文件。此正则表达式可以修改为忽略不应考虑的任何类型的文件。默认正则表达式会忽略像 __len__()
这样的函数,可能不希望记录它们是否在示例中使用。