作为一个触坑快一年的蒻鸡,从ubantu liunx到win10 vscode/pycharm的环境,从嵌入式ros到深度学习、机器学习 ... 曾几何时,意气风发的菜鸡,立志学好xx技术,于是开始跑别人源码,或是为了复现,或是为了细细研读,从而更深入理解理论。然而在跑程序的时候, 往往卡在第一步“导包” ...QAQ。每当遇到跑的时候弹出的错误时,总是习惯性的Ctrl c/v +百度来解决,当然有的时候似乎很快能解决:例如简单的pip install xx。然而,这样放弃思考问题原因的方式,不总是那么有效的。总会有天,会发现无论怎么搜解决方案,总是不能解决导包的问题。往往一个最简单的事,却被困扰的最长时间,最炸裂的是,电脑前坐一天,尝试了几乎所有网上的解决方案,根本不知道原因在哪儿。
下面我们将细细讲一下关于 导包 所引起的问题,分析其前因后果。
适用情况:
本文主要讨论的环境是在 win10+anaconda+python3.7.x+vscode;
lliunx环境可参考:https://blog.csdn.net/cc1949/article/details/78285842
适用的问题包括但不限于:No module named xx;ImportError: cannot import name 'XXXX';python import模块报错;
本文着重解决的是通用性的问题,一些由特殊原因导致的错误,不在本文讨论范围
第一部分:pip install 与conda install
1.pip 与conda 是什么?
conda是一种通用包管理系统,是想要构建和管理任何语言的任何类型的软件。因此,它也适用于Python包。
pip是Python的官方的包管理器,最常用于安装在Python包索引(PyPI)上发布的包。PyPI网址:https://pypi.python.org/pypi 可以在这上面查询是否有自己需要的python包
pip是Python包的通用管理器; conda是一个与语言无关的跨平台环境管理器。
更多操作的区别,详见:https://docs.conda.io/projects/conda/en/latest/commands.html#conda-vs-pip-vs-virtualenv-commands
by the way,我发现刚开始入坑的同学真的不喜欢看官方文档,网上照抄文档的解答方案竟会有那么多赞?其实很多问题在文档中会有提及和描述。
区别与联系:
补充与说明:
pip安装不会安装所有的依赖项只会安装部分依赖项,而conda会安装全部;
pip与conda不会重复安装已经安装的依赖;
pip安装的内容不会显示在anaconda navigation的环境中,conda会;
2.pip install 与conda install 做了什么?
当然,我们都知道他们可以安装包。但是更细节的呢?
(1)安装包的所在文件夹位置不同(这个问题很多高赞的文章其实表述的不完整,我也是在跑程序的时候发现的)
地址不同,意味着在import时候,搜索的地址是不同的。因此,在对各类包版本管理的时候要注意
使用conda install时,不论python选择conda中的啥环境,总有默认安装地址为:E:\anaconda\pkgs (E盘是安装anaconda的位置)。因此我们可以默认为conda install就是在总环境下安装安装包,各类子环境可以通用其安装包。
使用pip install时,就要分情况讨论了
如果在配置vscode时选择的python编译器是来自地址:E:\anaconda\python.exe 也就是说,它是来自conda(base)环境,在vscode中选择编译环境是如图所示。
那么这个时候,pip install的安装位置是在:E:\anaconda\Lib\site-packages
如果在配置vscode时选择的python编译器是来自地址:E:\anaconda\python.exe 也就是来自conda的子环境,在vscode中选择编译环境是如图所示。
那么这个时候,pip install的安装位置是在:E:\anaconda\envs\tensorflow2\Lib\site-packages
(2)安装包在文件夹中的 格式 的区别
安装包存在的格式,举例pip/conda install numpy
使用的pip install在 \Lib\site-packages 文件夹下:
通常包含两个文件的格式,两个文件都有用
使用的conda install在 \pkgs 文件夹下:
通常包含多个文件的格式,但只有最新版本的那个文件有用,其余都是可以删除
第二部分:版本不匹配问题
包与包之间的版本不匹配问题,可能会导致,你明明已经安装了某安装包,却还是会导包报错;
又或者明明已经pip 安装了相应对应版本,却还是导包报错,为什么呢?
1.conda list与pip list
区别:
Conda 除了虚拟环境下的还有关联文件下;Pip只有当前虚拟环境下
当关联环境下有这个包,再用conda在其他虚拟环境下,下载该包就会直接关联,不用下载
比如说base环境下有包,在另一个环境下下载同样的包,就会关联上,不用真的下载,直接复制过去或者关联即可
pip下的list是conda下list的子集
conda list 列出的所有安装包信息检索范围为:E:\anaconda\pkgs + 对应环境下\Lib\site-packages 中的所有安装包信息(不包含重复,并且列出的安装包并非是最新版本)
输入conda list后,截取的部分内容:
其中,注意到红框部分,表示conda在该环境下的关联的pip包。也就是来自对应环境下\Lib\site-packages中的包。请注意,这里的 torch 版本是1.7.1,稍后我们将对比pip list中的torch版本
pip list 列出的所有安装包信息检索范围为: 对应环境下\Lib\site-packages 中的所有安装包信息
输入pip list后,截取的部分内容:
注意到红框部分torch版本为1.8.1,
为什么conda list 与pip list 下的某些安装包版本会不一样呢?
在import torch的时候系统会import哪个版本呢?
2.版本不一致问题
接上问题,我们展开讨论
为什么conda list 与pip list 下的某些安装包版本会不一样呢?
由上图可知,conda中的torch版本是来自pip的安装目录,因此我们打开当前环境的pip安装目录,即 对应环境下\Lib\site-packages
欸,发现torch是1.8.1版本,与pip list对应。那conda list中的torch 1.7.1是哪儿来的呢?——这个目前我也不知道了 ......~_~
欸,我想起来,我曾经手动删除了来自 对应环境下\Lib\site-packages 环境下的torch 1.7.1 版本。可能这是没用命令行删除的原因。即便不是这样,还是会遇到conda lisst 与 pip list版本不一致问题
遇到版本不一致时,一定要明确系统到底import哪个版本。
在import torch的时候系统会import哪个版本呢?
输入:
import torch
print(torch.__version__) #注意是双下划线
得到:
1.8.1+cpu
说明此时,系统import的是1.8.1+cpu版本的torch。
那么在安装新包的时候一定要注意安装包与安装包的版本依赖问题
如果两个依赖安装包版本不对应的话,系统可能就会报:No module named xx;ImportError: cannot import name 'XXXX';python import模块报错;
比如torch与torchtext的版本对应问题,
可以在 https://github.com/pytorch/text 查看。其他的版本问题同样可以在github中搜到项目官方文档,里面一般会给出依赖版本。
可以手动删除或添加对应安装包,前提是符合文件格式(上文讨论过),也可以pip conda操作
第三部分:其他
遇到其他不能解决的问题,可以去github官方文档提issue或者在issue中查找你出现的问题;
不到万不得已,不要随便删除环境,重新安装所有包;
在stackoverflow 中查相关问题 ,准确很多
希望本文能帮到正在被各类导包问题折磨的你
如果还有相关问题,请在评论区讨论,随缘回复~
本人过于蒻 ~
文中若有错误,请大佬在评论区不吝赐教~ 定及时改正!