ChatGPT解决这个技术问题 Extra ChatGPT

如何在 conda 环境中使用 Jupyter 笔记本?

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

看起来,this is not quite straight forward and many users have similar troubles

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

这个问题已经被问过很多次了,但是没有好地方回答它,大多数问答和 Github 票都比较乱所以let's start a new Q&A here

这个问题困扰了我好多年!感谢您解决它 - 正如你所说 - 对此的 git 问题跟踪是一团糟

l
lumbric

免责声明:ATM 仅在 Ubuntu 和 Windows 中测试(请参阅此答案的评论)。

Jupyter 在名为kernel 的单独进程中运行用户的代码。内核可以是不同的 Python 安装(在不同的 conda 环境或 virtualenv 或 Python 2 而不是 Python 3 中),甚至可以是不同语言的解释器(例如 Julia 或 R)。通过指定解释器和名称以及一些其他参数(请参阅 Jupyter documentation)来配置内核,并且配置可以存储在系统范围内,用于活动环境(或 virtualenv)或每个用户。如果使用 nb_conda_kernels,除了静态配置的内核,每个安装了 ipykernel 的 conda 环境的单独内核将在 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 notebook 的其余部分可被视为编辑器或查看器,无需为每个环境单独安装它并将其包含在每个 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 documentationIPython documentation。在大多数 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"
}

选项 3:使用 nb_conda_kernels 在 conda 环境中使用内核

安装 package 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

在 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 笔记本中:

!jupyter-troubleshoot

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

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

jupyter kernelspec list

常见错误和陷阱

conda 环境中未安装 Jupyter 笔记本

注意:症状不是此处描述的问题所独有的。

症状:在 conda 环境中安装的模块(但未在系统范围内安装)的 Jupyter 笔记本中的 ImportError,但在 Python 终端中导入时没有错误

说明:您尝试在 conda 环境中运行 jupyter notebook(选项 1,见上文),此 conda 环境没有内核配置(这将是选项 2)并且 nb_conda_kernels 不是已安装(选项 3),但 jupyter notebook 未(完全)安装在 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(另请参见 here):

 $ 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-notebookcalls it 启动了一个新的 Python 进程。 /usr/bin/jupyter-notebook 中的 shebang 是 #!/usr/bin/python3not a dynamic #!/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 生成(参见 herehere)。

~/.local/share/jupyter/kernels/python3/kernel.json 中的用户内核规范可能会覆盖系统范围和环境内核。如果缺少环境内核或用户内核指向环境选项1之外的python安装(在环境中安装jupyter)将失败。

有关此问题和变体的出现和讨论,请参阅 hereherehere 以及 hereherehere

解决方案:使用 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 应该已经创建了环境(也许尝试重新创建环境并重新安装所有软件包?)。

如果用户内核规范阻止了环境内核规范,您可以删除它或使用相对 Python 路径,该路径将使用 $PATH 来确定要使用哪个 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 notebook(选项 1),但在运行之前没有激活 conda 环境,它可能会运行系统的 jupyter。

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

 conda activate my-conda-env
 jupyter notebook

损坏的内核配置

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

说明:如果您尝试使用选项 2,即通过使用内核的显式配置从系统运行 Jupyter 并在 conda 环境中运行 Jupyter 内核,但它的行为不符合您的预期,配置some way 中可能已损坏。

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

Python 2 与 3

症状: ImportError 由于 wrong Python version of the Jupyter kernelother problems with Python 2/3

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

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。

解决方案: Don't use Python 2 ;-)


选项 3 有一个错误:nb_conda 之所以有效,是因为它将 nb_conda_kernels 作为依赖项安装。 nb_conda_kernels 是 env 中的 Jupyter 实例自动识别安装了 ipykernel (see docs) 的任何 env 的唯一要求。 nb_conda 包用于 Jupyter 扩展,它向 Jupyter 添加了一个“Conda”选项卡,提供了一个类似于 Anaconda Navigator 的 GUI 来管理环境。
@merv 是的!非常感谢您指出这一点,我已经纠正了错误。
选项 1:conda install juypter 中的代码应为 conda install jupyter
我确认这在 Windows 上也可以正常工作。您似乎失去了 !pip install xxx 命令,但这是一个很好的权衡。
选项 1 适用于 Manjaro - 谢谢;干净的解决方案
S
Siddharth Shakya

以下为我工作:

激活您要使用的环境: conda activate pip install ipykernel(如果您还没有) python -m ipykernel install --user --name=


我想这基本上就是我在上面选项 2 中的回答中描述的内容,但使用了稍微不同的命令。
我只是觉得答案太长了,直到那时才读到..从我自己的搜索中我得到了这 3 个命令,这对于寻找快速答案而不是整篇文章的人会有所帮助。
M
Minura Punchihewa

以下命令也可用作创建运行最新版本 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 

这基本上是我回答中的选项 1,但使用 conda install 的快捷方式。可以做到,如果你想少输入一个命令。如果包可以通过 conda 获得,我不鼓励使用 pip。