注意: 该ATM仅在Ubuntu和Windows上进行过测试(请参见对此答案的评论)。
Jupyter在名为“kernel”的独立进程中运行用户的代码。Kernel可以是不同的Python安装(在不同的conda环境或virtualenv中或者Python 2而不是Python 3),甚至可以是其他语言的解释器(例如Julia或R)。通过指定解释器、名称和一些其他参数来配置内核(参见
Jupyter文档),并且可以将配置存储系统范围内、对于活动环境(或virtualenv)或每个用户进行存储。如果使用
nb_conda_kernels
,除了静态配置的内核外,在Jupyter笔记本中还将提供每个安装了
ipykernel
的conda环境的单独内核。
简而言之,有三种使用conda环境和Jupyter的选项:
选项1:在conda环境内运行Jupyter服务器和内核
做以下操作:
conda create -n my-conda-env
conda activate my-conda-env
conda install jupyter
jupyter notebook
Jupyter将在conda环境中完全安装。可以为不同的conda环境使用不同版本的Jupyter,但这可能有点过度。只需在环境中包含内核即可,该内核是包装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
conda install jupyter
jupyter notebook
内核和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"
}
选项3:使用nb_conda_kernels在conda环境中使用内核
安装包nb_conda_kernels
后,每个包含conda软件包ipykernel
或其他内核(R,Julia等)的conda环境都会自动提供一个单独的内核。
conda activate my-conda-env
conda install ipykernel
conda deactivate
conda activate base
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
/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笔记本中使用:
!jupyter-troubleshoot
这将打印出关于输出、安装的库和其他信息的大量有用信息。当询问有关Jupyter安装问题的帮助时,最好在错误报告或问题中提供此信息。
要列出所有配置的Jupyter内核,请运行:
jupyter kernelspec list
常见错误和陷阱
在conda环境中未安装Jupyter Notebook
注意:症状不一定唯一。
症状:在Jupyter笔记本中导入已在conda环境中安装(但未在系统范围内安装)的模块时出现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
(也可参见
此处)。
$ conda create -n my-conda-env
$ conda activate my-conda-env
$ conda install ipykernel
$ which jupyter
/opt/miniconda3/envs/my-conda-env/bin/jupyter
$ which jupyter-notebook
/usr/bin/jupyter-notebook
这是因为
jupyter notebook
会寻找
jupyter-notebook
,并在
/usr/bin/jupyter-notebook
中找到它
进行调用,从而启动一个新的Python进程。在
/usr/bin/jupyter-notebook
文件中的shebang是
#!/usr/bin/python3
,
不是动态shebang#!/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
注意:症状并不唯一适用于此处描述的问题。
症状:在Jupyter笔记本中,对于在conda环境中安装的模块(但未在系统范围内安装),会出现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
生成(请参见here和here)。
~/.local/share/jupyter/kernels/python3/kernel.json
中的用户内核规范可能会覆盖系统范围和环境内核。如果缺少环境内核或用户内核指向环境外的python安装,则选项1(在环境中安装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
应该已经创建了环境(也许尝试重新创建环境并重新安装所有软件包?)。
如果用户内核规范阻止环境内核规范,则可以删除它或使用相对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笔记本(选项1),但在运行之前没有激活conda环境,则可能会运行系统的jupyter。
解决方案:在运行Jupyter之前激活conda环境。
conda activate my-conda-env
jupyter notebook
内核配置损坏
症状:出现奇怪的事情。可能与上述症状相似,例如 ImportError。
解释:如果您尝试使用选项 2,即从系统运行 Jupyter 并在 conda 环境中使用 Jupyter 内核,但它的行为不符合您的预期,则配置可能已经以 某种方式 损坏。
解决方案:检查 ~/.local/share/jupyter/kernels/my-kernel-name/kernel.json
中的配置,并手动修复错误或删除整个目录并使用上面提供的选项 2 命令重新创建它。如果您找不到内核配置,请运行 jupyter kernelspec list
。
Python 2 vs 3
症状:由于 Jupyter 内核的 Python 版本错误 或其他 Python 2/3 的问题导致 ImportError
解释:内核配置可能会产生各种混乱和误导性的影响。例如,默认的 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。
解决方案:不要使用Python 2;-)