Jupyter Notebook在不同环境中运行内核

77

我陷入了一些可怕的virtualenv混乱中。帮帮我?!

我用conda管理环境。直到最近,我只有一个python2的jupyter笔记本内核,但是我决定把自己踢着踹着拖进21世纪,并安装了python3内核;我忘了我是怎么做的。

我的主要(anaconda) python默认为2.7。

所以这里我正在愉快地尝试从我闪亮的新python3内核中使用beautiful soup,但似乎无法做任何事情来获取它发现软件包的任何环境。即(所有来自笔记本):

from bs4 import BeautifulSoup 

-> ImportError: No module named 'bs4'

好的,没问题,我将使用shell魔法进行安装。对吧?对吧?

! pip install bs4

--> Collecting bs4
  Downloading bs4-0.0.1.tar.gz
Requirement already satisfied (use --upgrade to upgrade): beautifulsoup4 in /Users/[MY-USER]/anaconda/lib/python2.7/site-packages (from bs4)
[...]
Successfully built bs4
Installing collected packages: bs4
Successfully installed bs4-0.0.1

from bs4 import BeautifulSoup 

-> ImportError: No module named 'bs4'

糟糕了,难道它认为我在一个2.7环境中,即使我正在运行Python3内核?那是不行的。

! conda info --envs
--> # conda environments:
#
flaskenv                 /Users/[MY-USER]/anaconda/envs/flaskenv
mesa                     /Users/[MY-USER]/anaconda/envs/mesa
py35                     /Users/[MY-USER]/anaconda/envs/py35
root                  *  /Users/[MY-USER]/anaconda

好的,我可以修复这个问题。其中一个是3.5环境。

! source activate py35
--> prepending /Users/[MY-USER]/anaconda/envs/py35/bin to PATH

! conda install beautifulsoup4
--> Fetching package metadata .......
Solving package specifications: ..........

# All requested packages already installed.
# packages in environment at /Users/[MY-USER]/anaconda:
#
beautifulsoup4            4.4.1                    py27_0  

关于...

! pip install bs4
--> Requirement already satisfied (use --upgrade to upgrade): bs4 in /Users/[MY-USER]/anaconda/lib/python2.7/site-packages

更令人担忧的是...

from bs4 import BeautifulSoup 

-> ImportError: No module named 'bs4'

啊!头撞桌我是否需要杀掉内核才能解决这个问题(并重新运行一些工作)?杀死内核甚至有效吗?我如何让我的Jupyter内核知道它应该在什么环境下运行?

谢谢!


可能是[在Jupyter笔记本中使用特定的虚拟环境执行Python脚本]的重复问题(https://dev59.com/1lwX5IYBdhLWcg3wtBMa)。 - muon
+1 for headdesk - 这就是我在过去两天里与Tensorboard和Jupyter等工具打交道时的状态...哦,人性啊! - Julian Moore
有趣的问题让我笑了,“我已经陷入了某种可怕的虚拟环境混乱中”。 - devdanke
7个回答

181

这是ipython / Jupyter的一个棘手部分。可用内核集与您启动jupyter Notebook时的virtualenv无关。诀窍在于在您想要将其唯一标识给jupyter的环境中设置ipykernel包。请参阅多个ipykernels文档

source activate ENVNAME
pip install ipykernel
python -m ipykernel install --user --name ENVNAME --display-name "Python (whatever you want to call it)"
如果您只想在 conda 环境中拥有一个单独的 Python 3 内核,只需使用 python -m ipykernel install --user,它将重置默认的 Python 到虚拟环境中的 Python。
是的,您需要重新启动内核并重新运行之前的步骤。
参见:在 IPython Notebook 中同时使用 Python 2.x 和 Python 3.x

3
谢谢!运行得非常顺利。 - Paul Gowder
2
我还发现我没有将jupyter安装到新环境中,但是它仍然可以通过'juptyer notebook'命令启动。因此,最初我没有意识到这一点。 - geekly
非常感谢您的回答! - RafaJM
它可以工作,但我不明白Jupyter如何找到环境的路径。 kernel.json文件中没有提到它。 - Nils

12

如果你的环境已经创建好,@tschundler的解决方案完美适用。

如果你想在创建虚拟环境时更改默认内核并避免任何手动配置,只需要在conda命令的末尾添加jupyter

conda create --name ENVNAME python=PYTHONVERSION jupyter

当你使用ipython或jupyter notebook时,将会使用正确的内核。


9

在我的情况下,Jupyter 无法“选择”虚拟环境的 Python。因此,我需要编辑 ~/.local/share/jupyter/kernels/{my_env_name}/kernel.json 并且在 argv 键中添加解释器的路径。


1
如果我可以点赞5次,我会这么做。我使用Visual Studio Code作为控制台的Windows子系统,安装了一个虚拟环境,然后安装了Jupyter,但是我无法使用虚拟环境中的库。这个方法解决了我的问题! - monkey intern
你必须替换argv的第一个参数吗?它仍然似乎不起作用... Jupyter是如何被通知的? - Kaushik J
我可以看到 jupyter 文件夹,但是它下面没有 kernels 文件夹。 - Ziyuan

4

这里还有一个简单的方法

workon my-virtualenv-name  # activate your virtualenv, if you haven't already
pip install tornado==4.5.3
pip install ipykernel==4.8.2

您现在应该能够在IPython笔记本菜单中看到您的内核:Kernel -> Change kernel,并能够切换到它(在列表中出现之前,您可能需要刷新页面)。从那时起,IPython将记住该笔记本要使用哪个内核。这对我很有效。 来源

workon不起作用,你知道任何解决方案吗?我已经尝试搜索了,但它没有起作用。我正在使用VS Code。 - damanpreet singh

1
pip install --user ipykernel
python -m ipykernel install --user --name=myenv

Output
Installed kernelspec myenv in /home/user/.local/share/jupyter/kernels/myenv

并进入上级目录 打开 kernel.json

{
 "argv": [
  "/home/user/anaconda3/envs/myenv/bin/python", # path to your virtual environment python
  "-m",
  "ipykernel_launcher",
  "-f",
  "{connection_file}"
 ],
 "display_name": "myenv",
 "language": "python"
}

0

我知道这是一个旧问题,但没有人提到nb_conda_kernels,这个工具是为了解决这个问题而制作的。你必须在启动运行笔记本的环境中安装它,以及任何其他已安装核心的环境(ipykernelr-irkernel等)将作为选项(启动首选内核)可用:

enter image description here


0

在这里分享我的经验,以防有人犯同样的错误:

简述

在VSCode中,我从Ubuntu终端创建了虚拟环境,但忘记同时激活WSL扩展。一旦我激活了WSL扩展,就能够将Jupyter内核更改为我的虚拟环境。

详细说明

使用VSCode时,我使用WSL扩展(请参见此处)。我从Ubuntu终端[创建了一个新终端并选择了“Ubuntu(WSL)”]创建了我的虚拟环境,然后去我的Jupyter笔记本更改内核,但它没有出现在列表中。

我尝试了上面提出的解决方案,将kernel.json的路径添加到我的虚拟环境中,并适应我的情况(我不使用conda),但我惊讶地发现我的环境中的文件夹bin没有名为python的文件。

解决方案是激活WSL扩展:右下角>单击箭头(打开远程连接)>在WSL中重新打开文件夹。

之后,在资源管理器中,我可以看到bin文件夹下出现了两个新条目:PythonPython3(右侧的箭头似乎表示它们是符号链接)。 虚拟环境现在显示了Python符号链接。

然后我去我的Jupyter笔记本,将内核更改为我的虚拟环境。

最终,我不需要更改kernel.json中的路径。

P.S:以上是我对于我的问题及其解决方案的理解,由于我对Linux的知识几乎为零,因此欢迎任何补充/改进这个答案的评论!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接