設定#
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 警告,您可以新增
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 會透過在 sphinx/builders/html.py
中使用 md5(str(obj).encode()).hexdigest()
來檢查設定值,以判斷建置環境是否已變更,進而判斷是否應重寫 *所有* 文件。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'],
}
在這裡,我們建立兩個主要圖庫 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()
函式並搭配 key
引數進行排序,預設值設定為 NumberOfCodeLinesSortKey(src_dir)
,它會根據程式碼行的數量排序檔案。
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)
在我們的範例入門範例 - 繪製 sin中查看完整運作方式。
若要在您的文件中啟用此功能,您需要在 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.dev.org.tw'
。
如果您想對普通的 reST 文件執行相同的操作,請參閱純 reST 範例。
解析模組路徑#
在尋找物件的連結時,預設情況下我們會使用最短的模組路徑,並檢查它是否仍然指向相同的物件。這是因為定義在較深模組中的類別,通常會被記錄在較淺的模組中,因為它在較高層級模組的 __init__.py
中被導入(因此這是使用者期望的命名空間)。
然而,如果您在程式碼中使用繼承類別,並且遇到不正確的連結(指連結指向物件的基礎類別而不是子類別),則 prefer_full_module
選項可能會解決您的問題。請參閱GitHub issue 以了解更多背景資訊。
為了使此功能在您的文件中生效,您需要在 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
指令,讓您可以輕鬆地將簡化版的範例集新增到您的 Sphinx 文件 .rst
檔案中。因此,迷你範例集指令支援傳遞任何以下項目的清單(以空格分隔)
物件的完整限定名稱(請參閱新增 API 文件的迷你範例集)- 這會新增程式碼中使用了該物件或範例文字中引用了該物件的所有範例
指向範例 Python 檔案的路徑字串,包括 glob 樣式(請參閱使用檔案路徑建立迷你範例集)
要使用物件名稱,您必須啟用反向參照生成,請參閱新增 API 文件的迷你範例集以取得詳細資訊。如果未啟用反向參照生成,則 MiniGallery
指令的物件條目將被忽略,所有條目將被視為路徑字串或 glob 樣式的路徑字串。請參閱使用檔案路徑建立迷你範例集以取得詳細資訊。
新增 API 文件的迷你範例集#
Sphinx-Gallery 可以為指定模組中的物件生成迷你範例集,其中包含以下所有範例:
在程式碼中使用函式/方法/屬性/物件或實例化類別(稱為隱式反向參照),或
在文字區塊中使用 sphinx 標記
:func:
/:meth:
/:attr:
/:obj:
/:class:
參照該函式/方法/屬性/物件/類別。如果您已將 default_role 在您的conf.py
中設定為任何這些角色,則可以省略此角色標記(稱為顯式反向參照)。
這允許您將物件的完整限定名稱(例如,函式、方法、屬性、類別)傳遞到迷你範例集指令,以新增所有與該物件相關的範例的迷你範例集。這在 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
中列出的模組的每個函式/類別。請注意,將為所有物件生成反向參照檔案。任何範例中未使用的物件將具有空檔案,以防止自動文件解析期間的包含錯誤。
backreferences_dir
應該是相對於 conf.py
檔案的相對字串或 pathlib.Path
物件,或者 None
。預設情況下它是 None
。
有時,某些函式幾乎在給定模組的每個範例中都被使用,例如 Matplotlib 中的 pyplot.show
或 pyplot.subplots
函式,因此大量且通常不相關的範例將連結到這些函式。為了防止這種情況,您可以透過將它們作為正規表示式包含在 exclude_implicit_doc
中,來排除某些物件的隱式反向參照。以下設定將排除任何隱式反向參照,以便僅針對文件中使用 Sphinx 標記明確提及的物件建立範例集: {'.*'}
。要排除上面提到的函式,您可以使用 {r'pyplot\.show', r'pyplot\.subplots'}
(請注意,如果名稱沒有歧義,您也可以寫成 pyplot.show
或僅寫成 show
,則需跳脫符號以比對點而不是任何字元)。
使用檔案路徑建立迷你範例集#
有時,您可能想要明確地使用沒有共同函式的檔案來建立 mini-gallery
,例如一組教學課程。因此,迷你範例集指令也支援傳遞
指向 sphinx 範例檔案的路徑字串(相對於
conf.py
)指向 Sphinx-Gallery 範例檔案的 glob 樣式路徑字串(相對於
conf.py
)
例如,下面的 rst 會為所有使用特定函式 numpy.exp
的範例、examples/plot_sin_.py
範例以及所有符合字串 /examples/plot_4*
的檔案,新增簡化版的範例集。
.. 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:: numpy.exp ../examples/plot_0_sin.py ../examples/plot_4*
從檔案中排序迷你範例集縮圖#
迷你範例集指令會產生與輸入檔案字串或物件名稱對應的縮圖範例集。您可以透過 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 的所有模組。
用於 autosummary
指令的範本檔案 module.rst
必須儲存在 _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
中新增以下 CSS:a.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 組態 html_static_path
包含您自己的 CSS 檔案來新增這些 CSS 類別,這將覆寫 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 檔案。若要在 /build
輸出目錄中建立名為(例如)junit-result.xml
的檔案,請設定配置鍵(路徑相對於 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
檔案,且註解應位於 docstring 下方的某個位置 (理想情況下是在程式碼區塊中,請參閱 移除配置註解)。
例如,以下定義應該使用 _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 仍然是測試版技術,因此點擊 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 Notebook 的資料夾名稱。這可以確保所有 Notebook 都集中在一個位置(儘管它們保留了資料夾階層結構),以防您希望使用者在一個會話中瀏覽多個 Notebook 範例。
- use_jupyter_lab(類型:布林值,預設值:
False
) Binder 連結啟動的預設介面將是 Jupyter Lab 還是傳統的 Jupyter Notebook 介面。
每個產生的 Jupyter Notebook 都會被複製到 notebooks_dir
中指定的資料夾。這將是 sphinx 輸出目錄的子資料夾,並包含在您的網站建置中。Binder 連結將指向這些 Notebook。
注意
目前無法使用 readthedocs.org 來託管由 Sphinx-Gallery 產生的 Notebook,因為 RTD 沒有提供您可以將 Binder 連結到的 GitHub 儲存庫。如果您想將 readthedocs 與 Sphinx-Gallery 和 Binder 連結一起使用,您應該獨立建置您的文件,並將其託管在 GitHub 分支上,同時使用 readthedocs 建置。
請參閱 Sphinx-Gallery Sphinx 設定檔,其中範例使用了公開的 Binder 伺服器。
為圖庫 Notebook 產生 JupyterLite 連結(實驗性)#
Sphinx-Gallery 會自動為使用圖庫建立的任何範例產生 Jupyter Notebook。 JupyterLite 使在瀏覽器中執行範例成為可能。此功能與 Binder 非常相似,因為您將獲得一個 Jupyter 環境,您可以在其中以 Notebook 的形式互動式地執行範例。與 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。
然後,您需要在 conf.py
中的 Sphinx 擴充功能中新增 jupyterlite_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(類型:布林值,預設值:
True
) JupyterLite 連結啟動的預設介面將是 Jupyter Lab 還是 RetroLab Notebook 介面。
- notebook_modification_function(類型:字串,預設值:
None
) 實作 Notebook 的 JupyterLite 特定修改的函式的完整限定名稱。預設情況下,它為
None
,這表示不會修改 Notebook。其簽名應為notebook_modification_function(json_dict: dict, notebook_filename: str) -> None
,其中json_dict
是當您執行json.load(open(notebook_filename))
時所得到的。該函式預期透過新增 Notebook 儲存格來就地修改json_dict
。它不應寫入檔案,因為sphinx-gallery
負責此操作。notebook_filename
是為了方便起見而提供的,因為根據檔案名稱修改 Notebook 很實用。此函式的潛在用途包括使用%pip install seaborn
程式碼儲存格安裝其他套件,或新增 Markdown 儲存格以指示預期 Notebook 不會在 JupyterLite 中運作,例如因為它使用未在 Pyodide 中封裝的套件。為了向後相容,它也可以是可呼叫物件,但這將不會被 Sphinx 正確快取為環境的一部分。- jupyterlite_contents(類型:字串,預設值:
jupyterlite_contents
) 相對於 Sphinx 原始碼目錄的已建置 Jupyter Notebook 將被複製到的資料夾名稱。這會被當作 Jupyterlite 內容使用。
您可以在 conf.py
中設定變數來設定 jupyterlite-sphinx
,請參閱 jupyterlite-sphinx 文件以取得更多詳細資訊。
如果發現 JupyterLite 的 Sphinx-Gallery 設定,將會發生以下額外的事情
使用一些合理的預設值設定
jupyterlite-sphinx
,例如設定jupyterlite_bind_ipynb_suffix = False
。文件中的已建置 Jupyter Notebook 將被複製到名為
<jupyterlite_contents>/
的資料夾(相對於 Sphinx 原始碼目錄)。如果
notebook_modification_function
不是None
,此函式將會將 JupyterLite 特定的修改新增至 Notebook。每個 Sphinx-Gallery 範例的 reST 輸出現在都會有一個
launch JupyterLite
按鈕。該按鈕將指向 JupyterLite 連結,該連結將在您的瀏覽器中啟動一個 Jupyter 伺服器,並將目前的範例作為 Notebook。
如果由於某些原因,您想要啟用 jupyterlite-sphinx
擴充功能,但不使用 Sphinx-Gallery Jupyterlite 整合,您可以執行以下操作
extensions = [
...,
jupyterlite_sphinx,
]
sphinx_gallery_conf = {
...
'jupyterlite': None
}
請參閱 Sphinx-Gallery Sphinx 設定檔,其中範例使用了 JupyterLite 整合。
控制 Notebook 下載連結#
預設情況下,下載 Jupyter Notebook 和啟動 Binder 或 JupyterLite(如果已啟用)的連結僅適用於 Python 範例。如果已啟用剖析其他檔案副檔名(使用 example_extensions
選項;請參閱透過比對模式剖析和執行範例),可以使用 notebook_extensions
選項來啟用 Notebook 下載。例如
sphinx_gallery_conf = {
"notebook_extensions": {".py", ".jl"}
}
其中列出的副檔名會與圖庫目錄中的檔案名稱進行比較。
注意
目前,所有產生的 Notebook 都將 Python 指定為核心。下載後,使用者需要手動變更為正確的核心。
使 Notebook 中的儲存格魔術可執行#
通常,教學課程會包含使用者可以複製/貼上到其終端機的 bash 程式碼。在有人建置文件時,不應執行此程式碼,因為他們的環境中已經有這些相依性。因此,它們通常以文字內的程式碼區塊形式撰寫。
#%%
# Installing dependencies
#
# .. code-block:: bash
#
# pip install -q tensorflow
# apt-get -qq install curl
這對於 .py
和 .html
檔案來說效果很好,但是在呈現為 Jupyter Notebook 時會產生問題。下載的 .ipynb
檔案將不會安裝這些相依性,並且在沒有執行 bash 程式碼的情況下將無法運作。
為了修正此問題,我們可以在 conf.py
中設定 promote_jupyter_magic
旗標。
sphinx_gallery_conf = {
...
'promote_jupyter_magic': True,
}
如果此旗標為 True
,則當正在建置 Jupyter Notebook 時,任何以 Jupyter 儲存格魔術(例如 %%bash
或 %%writefile
)開頭的程式碼區塊都將轉換為可執行的程式碼區塊。
對於我們之前的範例,我們可以將 Markdown 文字變更為
#%%
# Installing dependencies
#
# .. code-block:: bash
#
# %%bash
# pip install -q tensorflow
# apt-get -qq install curl
表示在執行 Jupyter Notebook 時會自動安裝 TensorFlow 和 Curl。這適用於任何儲存格魔術(而不僅僅是上述提及的那些),並且僅影響 Jupyter Notebook 的建立。
警告
最佳做法是確保 .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
來說,空白字元很重要,縮排是使用 Tab 字元,而不是空格字元。
或者,您可以將 plot_gallery
選項新增到您的 conf.py
檔案內的 sphinx_gallery_conf
字典中,將其設為預設值:
sphinx_gallery_conf = {
...
'plot_gallery': 'False',
}
最高的優先權始終給予 sphinx-build
命令的 -D 旗標。
注意
如果在您的 Makefile
中新增 html-noplot
,您還需要在您的 conf.py
檔案內的 sphinx_gallery_conf
字典中,明確設定 plot_gallery
的預設值,以避免出現 sphinx 設定警告。
壓縮圖片#
當寫入 PNG 檔案(預設的 scraper 格式)時,可以將 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
。
多解析度圖片#
網頁瀏覽器允許在 <img>
標籤中使用 srcset
參數,讓瀏覽器支援 適用於高 DPI/Retina 顯示器的響應式解析度圖片。Sphinx Gallery 通過 image_srcset
參數支援此功能:
sphinx_gallery_conf = {
...
'image_srcset': ["2x"],
}
這會在正常圖形 dpi(通常為 100 dpi)下儲存一個 1x 圖片,並以兩倍密度(例如 200 dpi)儲存一個 2x 版本。預設值是不額外產生圖片 ('image_srcset': []
),如果需要,您可以將其他解析度指定為清單: ["2x", "1.5x"]
。
matplotlib scraper 會在 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* 建置器。
圖片 scraper#
圖片 scraper 是一種外掛程式,可讓 Sphinx-Gallery 偵測在執行範例期間產生的圖片,然後將它們嵌入到文件中。可以通過將 scraper 名稱附加到您的 Sphinx-Gallery 設定中的 'image_scrapers'
元組來啟用 scraper。例如,若要抓取 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 writer,除非您使用 Matplotlib <3.3.1。
支援以下 scraper:
- matplotlib
Sphinx-Gallery 通過字串
'matplotlib'
維護一個用於matplotlib
圖形的 scraper。
- PyVista
PyVista 維護一個 scraper(適用於 PyVista >= 0.20.3),由字串
'pyvista'
啟用。
- PyGMT
有關如何與 Sphinx-Gallery 整合的詳細資訊,請參閱 他們的網站。
- qtgallery
此程式庫提供 Qt 視窗的 scraper。有關如何與 Sphinx-Gallery 整合的說明,請參閱 他們的儲存庫。
您可以為上述列出的套件之外的套件產生的圖片編寫自訂的 scraper。這是通過編寫自己的 Python 函數來定義如何偵測和檢索任意套件產生的圖片來完成的。有關說明,請參閱 編寫自訂圖片 scraper。如果您想出一個對一般使用有用的實作(例如,繪圖程式庫的自訂 scraper),請隨時將其新增到上面的清單中(請參閱此處的討論 這裡)!
使用多個程式碼區塊來建立單個圖形#
預設情況下,圖片會在範例中的每個程式碼區塊之後進行抓取。因此,以下內容會產生兩個圖,每個程式碼區塊一個圖:
# %%
# 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
來說,空白字元很重要,縮排是使用 Tab 字元,而不是空格字元。
或者,您可以將 abort_on_example_error
選項添加到您 conf.py
設定檔中的 sphinx_gallery_conf
字典中,以將其設為預設值:
sphinx_gallery_conf = {
...
'abort_on_example_error': True,
}
最高的優先權始終給予 sphinx-build
命令的 -D 旗標。
如果特定範例錯誤,請勿使建置失敗#
有時您可能希望即使有失敗的範例也保留圖庫。因此,您可以設定 Sphinx-Gallery 允許某些範例失敗,並且仍然以 0 結束程式碼。為此,您需要列出所有您希望允許在建置期間失敗的範例。請相應地變更您的 conf.py:
sphinx_gallery_conf = {
...
'expected_failing_examples': ['../examples/plot_raise.py']
}
在這裡,您列出您允許在建置過程中失敗的範例,請記住指定從您的 conf.py 到範例腳本的完整相對路徑。
注意
如果預期範例會失敗,則如果範例執行時沒有錯誤,Sphinx-Gallery 將會產生錯誤。
永遠不要因為錯誤而使建置失敗#
可以設定 Sphinx-Gallery,使其僅在範例失敗時記錄警告。這表示只有在將 -W
標誌傳遞給 sphinx-build
時,sphinx 才會以非零結束程式碼退出。可以透過設定來啟用此功能:
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 後端實現的,請參閱令人尷尬地平行化的 for 迴圈,以了解許多相關注意事項的文件 (例如,封裝、CPU 資源過度訂閱等)。
使用平行建置也會停用記憶體測量。
啟用範例推薦系統#
可以設定 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 (類型:布林值,預設值:False)
是否在範例展示廳內產生推薦。啟用此功能需要將 numpy 新增至相依性。
- n_examples (類型:整數,預設值:5)
要顯示的最相關範例數。
- min_df (類型:範圍 [0.0, 1.0] 中的浮點數 | 整數,預設值:3)
在建置詞彙表時,忽略文件頻率嚴格低於給定閾值的詞彙。如果為浮點數,則參數表示文件的比例;如果為整數,則表示絕對計數。此值在文獻中也稱為截止值。
- max_df (類型:範圍 [0.0, 1.0] 中的浮點數 | 整數,預設值:0.9)
在建置詞彙表時,忽略文件頻率嚴格高於給定閾值的詞彙。如果為浮點數,則參數表示文件的比例;如果為整數,則表示絕對計數。
- rubric_header (類型:字串,預設值:「相關範例」)
可自訂的標題。可以編輯為更具描述性的文字,或新增外部連結,例如,連結到 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 類別來顯示這些縮圖,預設最大為 160x112 像素。若要變更此設定,您可以透過 Sphinx 設定 html_static_path
(這會覆寫 Sphinx-Gallery CSS 檔案中的預設 CSS 類別) 加入您自己的 CSS 檔案來修改預設 CSS。下列 CSS 將以 250x250 像素顯示影像,而不是預設的 160x112 像素:
.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;
}
注意
thumbnail_size
的預設值將在版本 0.9.0 中從 (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 會在產生的輸出中寫入 產生者:… 通知。
可以使用 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
對於每個 capture_repr
設定,都會捕捉 'Hello world'
,因為這是導向標準輸出的。此外,
如果
capture_repr
為空元組,則不會捕捉任何其他內容。如果
capture_repr
為('__repr__')
,則2
也會被捕獲。如果
capture_repr
為('_repr_html_', '__repr__')
(預設值),Sphinx-Gallery 會先嘗試捕獲_repr_html_
。由於a
沒有這個屬性,它會接著嘗試捕獲__repr__
。a
確實有__repr__
方法,因此在這種情況下,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''
),表示不忽略任何類型。若要排除特定類型不被捕獲,可以將 'ignore_repr_types'
設定為符合要排除的類型名稱的正規表示式。
例如,以下組態會捕獲每個程式碼區塊最後一個表達式的 __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
可讓您控制當您的展示區有子區段(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,位於檔案末尾,連結到所有子區段的索引檔案。
產生的檔案結構和 toctree 會模仿父展示區資料夾的結構,這對於為某些主題產生帶有巢狀區段的側邊欄可能需要。
對於其他主題,具有兩個 toctree 可能會在側邊欄中導致不必要的重複。在這種情況下,您可以嘗試將所有父展示區範例移動到它們自己的子資料夾中,因為這將導致父展示區 index.rst
中只有一個 toctree,或者使用 nested_sections=False
。
nested_sections=False
會使 Sphinx-Gallery 的行為與 0.10.2 版本之前相同。具體來說,它會為整個展示區產生一個單一的索引檔案。這個索引檔案將包含父展示區和每個子區段的標頭,每個標頭後面都會跟著一個 toctree,連結到父展示區/子區段中的每個範例。對於某些主題,使用這些 toctree 產生的側邊欄會以扁平結構列出所有展示區項目,而不會反映子展示區的巢狀資料夾結構。
手動傳遞檔案#
預設情況下,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
中。當然,您可以將 toctree
新增到您的 GALLERY_HEADER.rst
中。
手動傳遞 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__()
這樣的函數,如果它們在範例中使用,可能不希望記錄它們。