做python开发的朋友应该都遇到过安装环境的问题,特别是对于深度学习的项目会涉及多个Python版本的环境已经环境要依赖一些C语言的依赖包,如果不用anconda来管理安装,而是用离线下载、编译的方式安装,不仅安装起来很麻烦,而且也很容易出问题。最好的方式就是使用anconda来管理和安装,只需要手动输入简单的命令,就能将非Python的包安装成功。
问题背景:
这个问题来源于一个读者,他在做一个图像识别的项目,算法分为两个模块,都是要依赖Pytorch框架。一个算法模块是基于python3.6的Pytorch框架框架实现的,一个是基于python3.7版本的Pytorch框架实现的,所以现在需要搞两个不互相依赖的环境来运行不同的算法。这里他打算使用anconda来管理这两个环境。
为了更清晰的还原问题,以安装pymysql这个包为例
问题由来:
在安装好 anconda后(已经确认anconda安装没有问题),就使用conda 创建一个指定的虚拟环境,然后在这个环境里使用 pip安装他需要的包,运行代码时,就显示此包不存在!!!
1.这里我先创建一个虚拟环境,然后在虚拟环境中安装pymysql这个包,然后终端会显示安装成功
2.然后直接在ipython的交互模式中导入pymysql这个包,这时候就显示上边这个问题:ModuleNotFoundError: No module named 'pymysql'
很多人可能很奇怪,明明在实在这个虚拟环境里面安装的包,为啥导入的时候,就显示这个包没有发现了???下面就来分析一下这个问题。
问题分析
其实这个问题出现的原因很简单。接着上面的例子,继续往下看:
1.正常情况下,只要在虚拟环境中使用pip安装成功一个包,那么使用pip list就能够看到安装的所有包,的确如下图所示,说明了pymysql就在这个虚拟环境中,那为啥了?
2. 接下使用pip --version命令的时候,就会有一个惊喜的发现:这个pip的路径居然是大环境的pip,而非anconda中的pip,那为什么会出现这种情况了?
我的理解是这样的:在使用 conda命令创建指定虚拟环境之后,conda不会自动给你这个虚拟环境内安装一个pip,这时候要是还在这个虚拟环境里使用pip安装包,这时候因为虚拟环境没有pip,所以它就会在大环境下去找,于是就找到了大环境下面的pip.而不同环境下的pip它会有自己特定的包的安装路径,所以就会出现刚才那个问题。虽然使用 pip install pymysql 显示已经安装成功,而且pip list的时候也显示有这个包(其实这里pip list的包全部都是大环境里面的包),但是导入就会出错。
解决办法:
上边已经将问题详细的还原和分析了,接下来就是在指定的虚拟环境中安装pip。办法很简单,直接在虚拟环境中输入下面的命令:
conda install pip
pip安装成功之后,再使用pip --version查看的话,就会发现这时候的pip路径已经是我们虚拟环境下的pip了。
为了验证问题是否已经解决,同样再安装一次pymysql,pip list的时候,下图也证实了pymysql确实安装在这个虚拟环境,
在ipython里面导入pymsql,刚才的错也没有再出现,表明安装成功!!!
反思与总结:
在平时的工作中,经常会遇到各种各样的环境问题,今天这个只是一个很简单的问题,以后可能遇到的问题更加复杂,但是不管是什么问题,只要按照上边的这种思路,一步步还原问题、分析问题、然后在针对性解决,才能不断地提升自己!!!
Python全家桶