Как мне заставить виджеты Juypter правильно отображаться через Sphinx и nbconvert?

#python #jupyter-notebook #jupyter #nbconvert #jupyter-widget

#питон #jupyter-записная книжка #jupyter #nbконвертировать #jupyter-виджет

Вопрос:

Я использую виджеты Jupyter в своих ноутбуках. Затем мои записные книжки обрабатываются через Sphinx nbsphinx для генерации HTML. Я заметил, что даже в простом примере ниже показан слайдер в моем ноутбуке (в Jupyter Lab), но сгенерированная соответствующая HTML-страница не показывает слайдер.

 import ipywidgets as widgets

widgets.IntSlider()
 

Я знаю, что есть способ заставить виджет отображаться, наблюдая за опубликованным HTML-кодом виджетов Juypter. Их книга построена с использованием Sphinx nbsphinx. Когда я смотрю на их конфигурацию Sphinx, у них включены следующие расширения.

 extensions = [
    'sphinx.ext.autodoc',
    'sphinx.ext.autosummary',
    'sphinx.ext.intersphinx',
    'sphinx.ext.mathjax',
    'nbsphinx',
    'jupyter_sphinx.execute',
    'IPython.sphinxext.ipython_console_highlighting',
]
 

Я считаю, что ключом к рендерингу виджетов из записной книжки в опубликованный HTML является jupyter_sphinx.execute расширение. Расширения моего проекта следующие. Обратите внимание, что при выдаче make html появляется предупреждение для изменения jupyter_sphinx.execute jupyter_sphinx (однако это не имеет значения, поскольку использование любого из них все равно не отображает виджеты).

 extensions = [
    'sphinxcontrib.bibtex',
    'nbsphinx',
    'sphinx.ext.mathjax',
    'sphinx_sitemap',
    'jupyter_sphinx'
]
 

Выполнив команду pip list , я вижу следующие пакеты.

jupyter-клиент 6.1.3
jupyter-консоль 6.1.0
jupyter-ядро 4.6.3
jupyter-сервер-прокси 1.5.0
юпитер-сфинкс 0.3.2
jupyterlab 2.1.4
jupyterlab-комментирование-сервис 0.2
jupyterlab-сервер 1.1.5
nbconvert 6.0.7
nbsphinx 0.8.0
sphinx-autobuild 2020.9.1
sphinx-rtd-тема 0.5.0
sphinx-карта сайта 2.2.0
sphinxcontrib-applehelp 1.0.2
sphinxcontrib-bibtex 1.0.0
sphinxcontrib-blockdiag 2.0.0
sphinxcontrib-devhelp 1.0.2
sphinxcontrib-htmlhelp 1.0.3
sphinxcontrib-jsmath 1.0.1
sphinxcontrib-qthelp 1.0.3
sphinxcontrib-serializinghtml 1.1.4
sphinxcontrib-websupport 1.2.2

Если вы посмотрите на их ipynb исходный код, все, что вы увидите, находится widgets.IntSlider() в одной из ячеек (там ничего особенного не происходит). Согласно nbconvert, рендеринг виджетов в реальном времени доступен с версии 4.3.

Любые идеи о том, какие дополнительные настройки или шаги мне не хватает?

Ответ №1:

Хорошо, решение оказалось проще, чем я думал. В Jupyter Lab перейдите в Settings > Save Widget State Automatically раздел и убедитесь, что этот параметр установлен.

Кроме того, вы можете перейти ~/.jupyter/lab/user-settings/@jupyter-widgets/jupyterlab-manager/plugin.jupyterlab-settings и настроить параметры следующим образом.

 {
    // Jupyter Widgets
    // @jupyter-widgets/jupyterlab-manager:plugin
    // Jupyter widgets settings.
    // ******************************************

    // Save Jupyter widget state in notebooks
    // Automatically save Jupyter widget state when a notebook is saved.
    "saveState": true
}
 

Решение было не столь ясным, но эта страница дала мне несколько подсказок.