如何在conda环境下使用Jupyter notebooks?

新手上路,请多包涵

通常在终端中运行 jupyter notebookjupyter-notebookipython notebook 在本地浏览器中启动 Jupyter 笔记本 URL 网络服务器(并打开)。使用 condaconda 环境 时, 运行允许导入安装在 conda 环境中的 Python 模块的 Jupyter notebook 的最佳方法是什么?

看起来 不是 简单 许多 用户 都有 类似 麻烦

最常见的错误消息似乎是:在 conda 环境中安装包 XYZ 之后 my-env 可以运行 import XYZ 在 python 控制台中启动 my-env Jupyter notebook 中的相同代码将导致 ImportError

这个问题已经被问过很多次了,但是没有好的地方可以回答,大部分的问答和Github的票都比较乱,所以 让我们在这里开始一个新的问答吧

原文由 lumbric 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 757
2 个回答

_免责声明_: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 服务器和内核

做类似的事情:

 conda create -n my-conda-env         # creates new virtual env
conda activate my-conda-env          # activate environment in terminal
conda install jupyter                # install jupyter + notebook
jupyter notebook                     # start server + kernel inside my-conda-env

Jupyter将完全安装在conda环境中。不同版本的 Jupyter 可以用于不同的 conda 环境,但这个选项可能有点矫枉过正。将内核包含在环境中就足够了,它是运行代码的包装 Python 的组件。 Jupyter 笔记本的其余部分可以被视为编辑器或查看器,没有必要为每个环境单独安装它并将它包含在每个 env.yml 文件中。因此,接下来的两个选项之一可能更可取,但这个是最简单的一个,绝对没问题。

选项 2:为 conda 环境创建特殊内核

做类似的事情:

 conda create -n my-conda-env                               # creates new virtual env
conda activate my-conda-env                                # activate environment in terminal
conda install ipykernel                                    # install Python kernel in new conda env
ipython kernel install --user --name=my-conda-env-kernel   # configure Jupyter to use Python kernel

然后从系统安装或不同的 conda 环境运行 jupyter:

 conda deactivate          # this step can be omitted by using a different terminal window than before
conda install jupyter     # optional, might be installed already in system e.g. by 'apt install jupyter' on debian-based systems
jupyter notebook          # run jupyter from system

内核的名称和 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 文件:

 {
 "argv": [
  "/opt/miniconda3/envs/my-conda-env/bin/python",
  "-m",
  "ipykernel_launcher",
  "-f",
  "{connection_file}"
 ],
 "display_name": "my-conda-env-kernel",
 "language": "python"
}

方案三:使用nb_conda_kernels 在conda环境下使用一个内核

安装 软件包 nb_conda_kernels 后,每个包含 conda 软件包 ipykernel 或不同内核(R、Julia 等)的 conda 环境会自动提供一个单独的内核。

 conda activate my-conda-env    # this is the environment for your project and code
conda install ipykernel
conda deactivate

conda activate base            # could be also some other environment
conda install nb_conda_kernels
jupyter notebook

您应该能够选择内核 Python [conda env:my-conda-env] 。请注意, nb_conda_kernels 似乎只能通过 conda 使用,而不能通过 pip 或其他包管理器(如 apt)使用。

故障排除

使用 Linux/Mac 命令行上的命令 which 会告诉你使用了哪个 jupyter,如果你使用选项 1(从 conda 环境中运行 Jupyter),它应该是来自你的 conda 环境的可执行文件:

 $ which jupyter
/opt/miniconda3/envs/my-conda-env/bin/jupyter
$ which jupyter-notebook   # this might be different than 'which jupyter'! (see below)
/opt/miniconda3/envs/my-conda-env/bin/jupyter-notebook

在笔记本中,您应该看到 Python 使用来自 conda 环境的 Python 路径:

 [1] !which python
/opt/miniconda3/envs/my-conda-env/bin/python
[2] import sys; sys.executable
'/opt/miniconda3/envs/my-conda-env/bin/python'
['/home/my_user',
 '/opt/miniconda3/envs/my-conda-env/lib/python37.zip',
 '/opt/miniconda3/envs/my-conda-env/lib/python3.7',
 '/opt/miniconda3/envs/my-conda-env/lib/python3.7/lib-dynload',
 '',
 '/opt/miniconda3/envs/my-conda-env/lib/python3.7/site-packages',
 '/opt/miniconda3/envs/my-conda-env/lib/python3.7/site-packages/IPython/extensions',
 '/home/my_user/.ipython']

Jupyter 提供命令 jupyter-troubleshoot 或在 Jupyter notebook 中:

 !jupyter-troubleshoot

这将打印很多有用的信息,包括上面提到的输出以及已安装的库和其他信息。当寻求有关 Jupyter 安装问题的帮助时,最好在错误报告或问题中提供此信息。

要列出所有已配置的 Jupyter 内核,请运行:

 jupyter kernelspec list

常见错误和陷阱

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:

 (my-conda-env) $ which jupyter-notebook
/usr/bin/jupyter

如果路径指向您的 conda 环境中的文件,则 Jupyter 将从 Jupyter 内部运行:

 (my-conda-env) $ which jupyter-notebook
/opt/miniconda3/envs/my-conda-env/bin/jupyter-notebook

请注意,当安装 conda 包 ipykernel 时,会提供一个可执行文件 jupyter ,但没有可执行文件 jupyter-notebook 。这意味着 which jupyter 将返回到 conda 环境的路径,但是 jupyter notebook 将启动系统的 jupyter-nootebook ---

  $ conda create -n my-conda-env
 $ conda activate my-conda-env
 $ conda install ipykernel
 $ which jupyter            # this looks good, but is misleading!
 /opt/miniconda3/envs/my-conda-env/bin/jupyter
 $ which jupyter-notebook   # jupyter simply runs jupyter-notebook from system...
 /usr/bin/jupyter-notebook

发生这种情况是因为 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:

  conda activate my-conda-env
 conda install jupyter
 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 列出活动内核位置。

 $ conda activate my-conda-env
$ jupyter kernelspec list
Available kernels:
  python3 /opt/miniconda3/envs/my-conda-env/share/jupyter/kernels/python3

如果环境中的内核丢失,您可以尝试在激活的环境中使用 ipython kernel install --sys-prefix 手动创建它,但最好检查您的安装,因为 conda install ipykernel 应该已经创建了环境(也许尝试重新创建环境并重新安装所有软件包?)。

如果用户内核规范阻止了环境内核规范,您可以将其删除或使用将使用 $PATH 的相对 python 路径来确定使用哪个 python 。所以像这样的事情应该完全没问题:

 $ cat ~/.local/share/jupyter/kernels/python3/kernel.json
{
 "argv": [
  "python",
  "-m",
  "ipykernel_launcher",
  "-f",
  "{connection_file}"
 ],
 "display_name": "Python 3",
 "language": "python"
}

未激活正确的 conda 环境

症状: 在 Jupyter 笔记本和 Python 终端中安装在 conda 环境中(但未在系统范围内安装)的模块的 ImportError

解释: 每个终端都有一组环境变量,当终端关闭时这些变量就会丢失。为了使用 conda 环境,需要设置某些环境变量,这是通过使用 conda activate my-conda-env 激活它来完成的。如果您尝试从 conda 环境中运行 Jupyter 笔记本(选项 1),但在运行它之前没有激活 conda 环境,它可能会运行系统的 jupyter。

解决方案: 在运行 Jupyter 之前激活 conda 环境。

  conda activate my-conda-env
 jupyter notebook

损坏的内核配置

症状: 发生奇怪的事情。可能与上述类似的症状,例如 ImportError

说明: 如果您尝试使用选项 2,即通过使用内核的显式配置从系统和 conda 环境中的 Jupyter 内核运行 Jupyter,但它的行为不如您预期,则配置可能以 某种方式 损坏。

解决方案: 检查配置 ~/.local/share/jupyter/kernels/my-kernel-name/kernel.json 并手动修复错误或删除整个目录,然后使用上面为选项 2 提供的命令重新创建它。如果找不到内核配置,请运行 jupyter kernelspec list

蟒蛇 2 与 3

症状: 由于 Jupyter 内核的 Python 版本错误Python 23 的其他问题 导致 ImportError

说明: 内核配置可能会产生各种混淆和误导的效果。例如,默认的 Python 3 内核配置将允许我启动在 Python 2 上运行的 Jupyter notebook:

 conda create -n my-conda-env
conda activate my-conda-env
conda install python=2
conda install jupyter
jupyter notebook

默认的 Python 3 内核:

 $ cat ~/.local/share/jupyter/kernels/python3/kernel.json
{
 "argv": [
  "python",
  "-m",
  "ipykernel_launcher",
  "-f",
  "{connection_file}"
 ],
 "display_name": "Python 3",
 "language": "python"
}

使用 Python 3 内核创建新的 Jupyter Notebook 后,即使 Jupyter 显示“Python 3”,也会使用来自 conda 环境的 Python 2。

解决方案: 不要使用 Python 2 ;-)

原文由 lumbric 发布,翻译遵循 CC BY-SA 4.0 许可协议

以下命令也可以用作一条线来创建运行最新版本的 Python 和最新版本的 Jupyter Notebooks 的 Conda 环境,

 conda create -n <env-name> python jupyter

如果你想安装特定版本的 Python 或 Jupyter,你可以这样做,

 conda create -n <env-name> python=<version> jupyter=<version>

例如,

 conda create -n <env-name> python=3.10.4 jupyter=1.0.0

如果您想在此环境中使用笔记本电脑的其他包,您可以执行以下操作,

 conda create -n <env-name> python jupyter <another-package> <another-package> ...

例如,

 conda create -n <env-name> python jupyter scikit-learn

请注意,与之前类似,这些命令将安装最新版本的 Python 和相关包。如果你想要特定的版本,你可以使用 =<version> 语法。

此外,在创建环境后,您仍然可以使用 pip installconda install 安装所需的任何软件包。

创建环境后(使用上面给出的任何方法),您可以简单地运行以下命令来激活您的环境并运行 Jupyter Notebooks,

 conda activate <env-name>
jupyter notebook

原文由 Minura Punchihewa 发布,翻译遵循 CC BY-SA 4.0 许可协议

推荐问题