背景知识
首先需要知道,在Anaconda中创建的虚拟环境是被包含在Anaconda中的(逻辑上),示意图如下。
这二者有逻辑上的上下级关系,也有文件路径的上下级关系,虚拟环境中内容的路径比Anaconda中内容的路径更底层(具体请看下图二者的sys.path)。所以会涉及到一个问题:软件和包的路径到底是基于虚拟环境还是Anaconda。
当软件路径和包安装的位置不同时会引起很多问题,比如下文提到的这个。
问题描述
如果需要在Anaconda中使用自带的jupyter notebook编写代码,需要注意jupyter的sys.path是基于整个Anaconda的路径。
也就是说,如果需要import的包安装在虚拟环境下,基于Anaconda路径的jupyter是找不到在虚拟环境下的包的,因为虚拟环境的路径更底层。于是jupyter无法直接import,会报ModuleNotFoundError: No module named 'xxx'
的错误。
在这种情况下,jupyter import失败,但虚拟环境中的python命令行可以正常import,就是因为python的路径是基于Anaconda的。
查看二者的sys.path,会发现路径不同。
这也就是上文提到的问题——jupyter的sys.path是基于整个Anaconda的,而python的sys.path是基于自己建立的虚拟环境的。要解决这个问题只需要让包的路径和jupyter的路径统一即可。
解决方案
如果想要修改jupyter的sys.path,可以尝试StackOverflow中的这些方法,但windows环境下更适合尝试将jupyter连接到虚拟环境。
jupyter更改内核后即可正常import虚拟环境中的包:
ps:因为只有Linux环境下才有 .bashrc
,所以修改 .bashrc
文件的方法只有在Linux环境下才可以用(而且根据StackOverflow里的提问者的说法,不知道到底有没有用)。