通常在终端中运行 jupyter notebook
或 jupyter-notebook
或 ipython notebook
在本地浏览器中启动 Jupyter 笔记本 URL 网络服务器(并打开)。使用 conda 和 conda 环境 时, 运行允许导入安装在 conda 环境中的 Python 模块的 Jupyter notebook 的最佳方法是什么?
看起来 , 这 不是 很 简单 , 许多 用户 都有 类似 的 麻烦。
最常见的错误消息似乎是:在 conda 环境中安装包 XYZ 之后 my-env
可以运行 import XYZ
在 python 控制台中启动 my-env
Jupyter notebook 中的相同代码将导致 ImportError 。
这个问题已经被问过很多次了,但是没有好的地方可以回答,大部分的问答和Github的票都比较乱,所以 让我们在这里开始一个新的问答吧。
原文由 lumbric 发布,翻译遵循 CC BY-SA 4.0 许可协议
_免责声明_:ATM 仅在 Ubuntu 和 Windows 中测试(请参阅对此答案的评论)。
Jupyter 在称为 kernel 的单独进程中运行用户代码。内核可以是不同的 Python 安装(在不同的 conda 环境或 virtualenv 或 Python 2 而不是 Python 3 中),甚至是不同语言(例如 Julia 或 R)的解释器。内核通过指定解释器和名称以及一些其他参数(请参阅 Jupyter 文档)进行配置,并且可以在系统范围内为活动环境(或 virtualenv)或每个用户存储配置。如果使用
nb_conda_kernels
,除了静态配置的内核之外,每个 conda 环境的单独内核ipykernel
安装将在 Jupyter 笔记本中可用。简而言之,如何使用 conda 环境和 Jupyter 有以下三种选择:
选项 1:在 conda 环境中运行 Jupyter 服务器和内核
做类似的事情:
Jupyter将完全安装在conda环境中。不同版本的 Jupyter 可以用于不同的 conda 环境,但这个选项可能有点矫枉过正。将内核包含在环境中就足够了,它是运行代码的包装 Python 的组件。 Jupyter 笔记本的其余部分可以被视为编辑器或查看器,没有必要为每个环境单独安装它并将它包含在每个
env.yml
文件中。因此,接下来的两个选项之一可能更可取,但这个是最简单的一个,绝对没问题。选项 2:为 conda 环境创建特殊内核
做类似的事情:
然后从系统安装或不同的 conda 环境运行 jupyter:
内核的名称和 conda 环境彼此独立,但使用相似的名称可能有意义。
只有 Python 内核将在 conda 环境中运行,系统中的 Jupyter 或不同的 conda 环境将被使用——它没有安装在 conda 环境中。通过调用
ipython kernel install
jupyter 配置为使用 conda 环境作为内核,请参阅 Jupyter 文档 和 IPython 文档 以获取更多信息。在大多数 Linux 安装中,此配置是 — 中的~/.local/share/jupyter/kernels/my-conda-env-kernel/kernel.json
*.json
文件:方案三:使用nb_conda_kernels 在conda环境下使用一个内核
安装 软件包
nb_conda_kernels
后,每个包含 conda 软件包ipykernel
或不同内核(R、Julia 等)的 conda 环境会自动提供一个单独的内核。您应该能够选择内核
Python [conda env:my-conda-env]
。请注意,nb_conda_kernels
似乎只能通过 conda 使用,而不能通过 pip 或其他包管理器(如 apt)使用。故障排除
使用 Linux/Mac 命令行上的命令
which
会告诉你使用了哪个 jupyter,如果你使用选项 1(从 conda 环境中运行 Jupyter),它应该是来自你的 conda 环境的可执行文件:在笔记本中,您应该看到 Python 使用来自 conda 环境的 Python 路径:
Jupyter 提供命令
jupyter-troubleshoot
或在 Jupyter notebook 中:这将打印很多有用的信息,包括上面提到的输出以及已安装的库和其他信息。当寻求有关 Jupyter 安装问题的帮助时,最好在错误报告或问题中提供此信息。
要列出所有已配置的 Jupyter 内核,请运行:
常见错误和陷阱
Jupyter 笔记本未安装在 conda 环境中
注意:症状并非此处描述的问题所独有。
症状: 安装在 conda 环境中的模块(但未在系统范围内安装)在 Jupyter 笔记本中出现 ImportError,但在 Python 终端中导入时没有错误
说明 : 您尝试从您的 conda 环境中运行 jupyter notebook(选项 1,见上文),没有针对此 conda 环境的内核配置(这将是选项 2)并且未安装 nb_conda_kernels(选项 3),但是jupyter 笔记本未(完全)安装在 conda 环境中,即使
which jupyter
可能会让您相信它是。在 GNU/Linux 中,您可以键入
which jupyter
来检查运行的是哪个 Jupyter 可执行文件。这意味着使用了系统的Jupyter,可能是因为没有安装Jupyter:
如果路径指向您的 conda 环境中的文件,则 Jupyter 将从 Jupyter 内部运行:
请注意,当安装 conda 包
ipykernel
时,会提供一个可执行文件jupyter
,但没有可执行文件jupyter-notebook
。这意味着which jupyter
将返回到 conda 环境的路径,但是jupyter notebook
将启动系统的jupyter-nootebook
---发生这种情况是因为
jupyter notebook
搜索jupyter-notebook
,找到/usr/bin/jupyter-notebook
并 调用它 启动一个新的 Python 进程。/usr/bin/jupyter-notebook
中的 shebang 是#!/usr/bin/python3
而 不是动态的#!/usr/bin/env python
。因此 Python 设法脱离了 conda 环境。我想 jupyter 可以调用python /usr/bin/jupyter-notebook
来否决 shebang,但是混合系统的 bin 文件和环境的 python 路径无论如何都不能正常工作。解决方案: 在conda环境中安装jupyter notebook:
错误的内核配置:内核配置为使用系统 Python
注意:症状并非此处描述的问题所独有。
症状: 安装在 conda 环境中的模块(但未在系统范围内安装)在 Jupyter 笔记本中出现 ImportError,但在 Python 终端中导入时没有错误
解释: 通常,系统提供一个名为 python3(显示名称“Python 3”)的内核,配置为使用
/usr/bin/python3
,参见例如/usr/share/jupyter/kernels/python3/kernel.json
。这通常被 conda 环境中的内核覆盖,它指向环境 python 二进制文件/opt/miniconda3/envs/my-conda-env/bin/python
。两者均由包ipykernel
生成(参见 此处 和 此处)。~/.local/share/jupyter/kernels/python3/kernel.json
中的用户内核规范可能会覆盖系统范围和环境内核。如果缺少环境内核或用户内核指向环境选项 1 之外的 python 安装(在环境中安装 jupyter)将失败。有关此问题及其变体的出现和讨论,请参见 此处、 此处、 此处 以及 此处、 此处 和 此处。
解决方案: 使用
jupyter kernelspec list
列出活动内核位置。如果环境中的内核丢失,您可以尝试在激活的环境中使用
ipython kernel install --sys-prefix
手动创建它,但最好检查您的安装,因为conda install ipykernel
应该已经创建了环境(也许尝试重新创建环境并重新安装所有软件包?)。如果用户内核规范阻止了环境内核规范,您可以将其删除或使用将使用
$PATH
的相对 python 路径来确定使用哪个python
。所以像这样的事情应该完全没问题:未激活正确的 conda 环境
症状: 在 Jupyter 笔记本和 Python 终端中安装在 conda 环境中(但未在系统范围内安装)的模块的 ImportError
解释: 每个终端都有一组环境变量,当终端关闭时这些变量就会丢失。为了使用 conda 环境,需要设置某些环境变量,这是通过使用
conda activate my-conda-env
激活它来完成的。如果您尝试从 conda 环境中运行 Jupyter 笔记本(选项 1),但在运行它之前没有激活 conda 环境,它可能会运行系统的 jupyter。解决方案: 在运行 Jupyter 之前激活 conda 环境。
损坏的内核配置
症状: 发生奇怪的事情。可能与上述类似的症状,例如 ImportError
说明: 如果您尝试使用选项 2,即通过使用内核的显式配置从系统和 conda 环境中的 Jupyter 内核运行 Jupyter,但它的行为不如您预期,则配置可能以 某种方式 损坏。
解决方案: 检查配置
~/.local/share/jupyter/kernels/my-kernel-name/kernel.json
并手动修复错误或删除整个目录,然后使用上面为选项 2 提供的命令重新创建它。如果找不到内核配置,请运行jupyter kernelspec list
。蟒蛇 2 与 3
症状: 由于 Jupyter 内核的 Python 版本错误 或 Python 2⁄3 的其他问题 导致 ImportError
说明: 内核配置可能会产生各种混淆和误导的效果。例如,默认的 Python 3 内核配置将允许我启动在 Python 2 上运行的 Jupyter notebook:
默认的 Python 3 内核:
使用 Python 3 内核创建新的 Jupyter Notebook 后,即使 Jupyter 显示“Python 3”,也会使用来自 conda 环境的 Python 2。
解决方案: 不要使用 Python 2 ;-)