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

时间:2019-09-23 19:16:43

标签: python jupyter-notebook environment-variables jupyter conda

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

似乎this is not quite straight forward and many users have similar troubles

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

这个问题已经被问过很多次了,但是没有一个很好的答案,大多数问答和 Github的票很乱,所以let's start a new Q&A here

1 个答案:

答案 0 :(得分:5)

免责声明:仅在Ubuntu中测试过,如果Windows / Mac OS中的内容有所不同,请发表评论。


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 juypter                # install jupyter + notebook
jupyter notebook                     # start server + kernel

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
jupyter notebook                                           # run jupyter from system

内核名称和conda环境彼此独立,但可能会使 使用类似名称的感觉。

仅Python内核将在conda环境中运行,系统或其他系统中的Jupyter 将使用conda环境-未安装在conda环境中。通过调用ipython kernel install,将jupyter配置为将conda环境用作内核,请参见 Jupyter documentationIPython documentation了解更多信息。在大多数Linux中 安装此配置是一个*.json文件 ~/.local/share/jupyter/kernels/my-conda-env-kernel/kernel.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

在笔记本中,您应该看到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笔记本中或在Jupyter笔记本中提供命令jupyter-troubleshoot

!jupyter-troubleshoot

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

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

jupyter kernelspec list

常见错误和陷阱

未在conda环境中安装Jupyter笔记本

注意:症状并非此处描述的问题唯一。

症状:对于在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(另请参见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笔记本:

 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安装(在 环境)将会失败。

有关此问题和变体的出现和讨论,请参见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环境

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

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

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

 conda activate my-conda-env
 jupyter notebook

破碎的内核配置

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

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

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

Python 2 vs 3

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

导致的ImportError

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

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之后,从conda中使用Python 2 即使Jupyter显示“ Python 3”,也会使用环境。

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