使VSCode的中的Jupyter Notebook访问同conda环境下的依赖

作为Python的一个依赖管理工具,Anaconda实现了Pip「全局安装」和virtualenv「本地安装」的折衷,它使用「按名访问」的方式实现环境的隔离,使使用者能够灵活的隔离和共享环境。

然而要使用Anaconda+Jupyter+VSCode这一套组合拳可有不少坑。

按照常识,在一个conda环境下安装Jupyter后应该可以直接访问对应环境下的包

1
2
conda create -n test python=3.8
conda install pytorch

在VSCode中选择名为test的conda环境,新建Jupyter notebook,执行

1
import torch

提示找不到torch这个包

1
2
3
4
5
6
---------------------------------------------------------------------------
ModuleNotFoundError Traceback (most recent call last)
<ipython-input-1-fbdd1ce2ac00> in <module>
----> 1 import torch
ModuleNotFoundError: No module named 'torch'

而从直接运行Python解释器却一切正常

1
2
3
4
5
Python 3.8.5 (default, Sep 3 2020, 21:29:08) [MSC v.1916 64 bit (AMD64)] :: Anaconda, Inc. on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import torch
>>> torch.__version__
'1.7.0'

在notebook中执行

1
2
import sys
print(sys.executable)

发现Jupyter notebook使用了默认conda环境中的python作为kernel

1
C:\Users\anaconda3\python.exe

要解决这个问题,需要将test环境下的python暴露出来。
执行

1
2
conda activate test
conda install nb_conda_kernels

安装完成后重新打开VSCode,在运行Jupyter notebook中的代码之前,在右上角的Select Kernel中切换到test中的Kernel,即可成功导入Pytorch。


原因分析:
VSCode中的Python扩展在打开.ipynb文件时使用的是base环境中的Jupyter,这样当然找不到test环境中的pytorch了。而在安装了nb_conda_kernels后,test环境中的ipykernel向base中的Jupyter报告了kernel spec,从而使得base中的Jupyter可以顺利的使用test中的ipykernel执行代码。而test中的ipykernel自然可以访问同在test下的pytorch了。更多请参见nb_conda_kernels的说明