概括
在复杂的设置中,jupyter-lab
进程和 Jupyter/IPython 内核进程在不同的 Python 虚拟环境中运行,请注意与 Jupyter 相关的 Python 包和 Jupyter 扩展(例如ipympl
,jupyter-matplotlib
)版本及其环境之间的兼容性。
即使在单一的 Python 虚拟环境中,也要确保遵守ipympl
兼容性表。
例子
几个如何运行 JupyterLab 的示例。
简单(st)
我猜想,运行 JupyterLab 的最简单的跨平台方式是从 Docker 容器中运行它。您可以像这样构建和运行 JupyterLab 3 容器。
docker run --name jupyter -it -p 8888:8888 \
# This line on a Linux- and non-user-namespaced Docker will "share"
# the directory between Docker host and container, and run from the user.
-u 1000 -v $HOME/Documents/notebooks:/tmp/notebooks \
-e HOME=/tmp/jupyter python:3.8 bash -c "
mkdir /tmp/jupyter; \
pip install --user 'jupyterlab < 4' 'ipympl < 0.8' pandas matplotlib; \
/tmp/jupyter/.local/bin/jupyter lab --ip=0.0.0.0 --port 8888 \
--no-browser --notebook-dir /tmp/notebooks;
"
当它完成时(这需要一段时间),终端中最底部的行应该是这样的。
To access the server, open this file in a browser:
...
http://127.0.0.1:8888/lab?token=abcdef...
您只需单击该链接,JupyterLab 就会在您的浏览器中打开。关闭 JupyterLab 实例后,容器将停止。您可以使用 重新启动它docker start -ai jupyter
。

复杂的
这个GitHub Gist说明了如何使用 JupyterLab 2 构建 Python 虚拟环境以及在容器中使用 Nodejs 构建所有必需的扩展,而无需在主机系统上安装 Nodejs。使用 JupyterLab 3 和预构建扩展,这种方法变得不那么相关了。
语境
我今天在调试%matplotlib widget
JupyterLab 2 中的不工作时摸不着头脑。我有单独的预构建 JupyterLab venv(如上所述),它为本地 JupyterLab 提供 Chromium“应用程序模式”(即c.LabApp.browser = 'chromium-browser --app=%s'
在配置中)和一些 IPython 内核从具有特定依赖项(很少更改)的简单 Python venv 和将自身暴露为 IPython 内核的应用程序。交互式“小部件”模式的问题以不同的方式表现出来。
例如,拥有
在浏览器控制台中,我遇到了这些错误:
Error: Module jupyter-matplotlib, semver range ^0.9.0 is not registered as a widget module
Error: Could not create a model.
Could not instantiate widget
在 JupyterLab 用户界面中:
%matplotlib widget
重启成功
- 图表卡在“正在加载小部件...”
- 使用图表输出重新运行单元格时没有任何内容
- 在以前的尝试
%matplotlib widget
中可能会引发类似KeyError: '97acd0c8fb504a2288834b349003b4ae'
ipympl==0.6.3
在浏览器控制台中的内核 venv降级:
Could not instantiate widget
Exception opening new comm
Error: Could not create a model.
Module jupyter-matplotlib, semver range ^0.8.3 is not registered as a widget module
一旦我根据ipympl
兼容性表制作了包/扩展:
它或多或少按预期工作。好吧,除了我将每个单元格与图表放在一起之外,还有很多小故障%matplotlib widget
,比如说在重新启动时,第一个图表“累积”了笔记本中所有图表的所有内容。对于%matplotlib widget
每个单元格,一次只有一个图表处于“活动状态”。并且在重新启动时仅呈现最后一个小部件(但手动重新运行单元格会进行修复)。