总结
在复杂的设置中,jupyter-lab 进程和 Jupyter/IPython 内核进程运行在不同的 Python 虚拟环境中,请注意与 Jupyter 相关的 Python 包和 Jupyter 扩展(例如ipympl、jupyter-matplotlib)版本以及它们在环境之间的兼容性。
即使在单个 Python 虚拟环境中,也要确保遵守 ipympl compatibility table。
示例
几个如何运行 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 和 pre-build extensions,这种方法变得不那么重要了。
上下文
我今天在调试 %matplotlib widget 在 JupyterLab 2 中不起作用时摸不着头脑。我有单独的预构建 JupyterLab venv(如上所述),它为本地 JupyterLab 提供 Chromium“应用程序模式”(即 c.LabApp.browser = 'chromium-browser --app=%s' in配置),以及来自具有特定依赖关系(很少更改)的简单 Python venv 的一些 IPython 内核以及将自身暴露为 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' 的问题
在浏览器控制台的内核 venv 中降级 ipympl==0.6.3:
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 compatibility table 制作了包/扩展:
-
在 JupyterLab“主机”venv 中:jupyter-matplotlib v0.8.3 扩展,ipympl==0.6.3
-
在内核 venv 中:ipympl==0.6.3, matplotlib==3.3.4
它或多或少按预期工作。好吧,除了我将%matplotlib widget 每个单元格与图表放在一起之外,还有很多小故障,比如说在重新启动时,第一个图表“累积”了笔记本中所有图表的所有内容。对于每个单元格%matplotlib widget,一次只有一个图表处于“活动状态”。并且在重新启动时仅呈现最后一个小部件(但手动重新运行单元格会进行修复)。