如果你和我一样,在安装库的时候pip与pip3随意换着使用,那你可能需要细心地看看这篇博客,兴许它能解决你目前安装库出现或即将出现的问题,又或许它会给你带来分析问题解决问题的思路的启发,不画大饼了,我们马上开始吧~
前提:我是在Windows上的Anaconda上的自己创建的tensorflow环境里面安装MedPy库的时候,遇到了问题从而对pip、pip3、和pip3.6有了更进一步的理解的。如果你没有安装过Anaconda没有创建过环境,不用担心,这篇博客你是完完全全可以享用的。为了表述方便,全程我以安装MedPy库为例进行讲解。
ps:全文较长,主要记录个人经历,供大家参考,若想直接获取干货,可参考其它朋友的简明版:
1、pip和pip3的区别
2、Python:pip和pip3的区别
首先我们了解一下什么是pip:
后面我们会在查询SimpleITK库的安装位置的截图中看到site-packages文件,可以留心验证一下。
我们通常在安装库的时候都是pip install [要安装的库名],考虑到速度问题,通常我们会加上镜像源,例如安装MedPy库,我们就会用下面的代码(这里我使用的是清华的镜像源)
pip install medpy -i https://pypi.tsinghua.edu.cn/simple
好像没有任何问题的,但是我使用这条命令的时候它偏偏就出现问题了。其中出现的问题我们省略不说,有兴趣的话可以去看看这篇博客。
于是我就艰难地找问题找问题,最后碰巧试了下面这行代码,竟然成功安装了
pip3 install medpy -i https://pypi.tsinghua.edu.cn/simple
成功安装之后我进入python里面试着import一下这个库【记住,我是在tensorflow环境里面进行安装的,将来我这个库也是在tensorflow环境里面进行使用,所以是在tensorflow环境里面输入python然后试着import库喔】
难过的是,它告诉我
ModuleNotFoundError: No module named 'medpy'
我当时就慌了,反复看自己安装成功的提示,Successfully告诉我,我就是安装成功了呀,如此奇怪,必定有鬼!
我开始分析最开始使用的安装代码和最后成功的安装代码(开篇的两条代码),发现他们的差别仅仅为一个是pip一个是pip3,一个 3竟然能差这么多?我迅速来到CSDN大家庭,搜索pip与pip3之间的区别,我得到了这样的回答:
管pip它位于什么目录,通过这个回答我就知道了pip和pip3的版本是不同的嘛,但是作为走在时代前沿的计算机学子,我的python肯定是python3对吧(好吧,仅仅是因为入门晚,大一下载的时候2已经逐渐淘汰了。。。)
总之,不管曾经的我多么放荡不羁,在多少个地方下载过多少python,划重点,**下载过多少Python!!!后面要考!!!**那根据上图中的第3点,我没有安装过python2只安装过python3啊,pip和pip3对于我来说不应该是一样的吗??
嘿嘿,这样想似乎有些草率了。。。我们从头慢慢开始分析
引起我思考的是因为我的那张安装成功的截图:
因为MedPy库有相关的依赖,其中有一个依赖的库的名称叫做SimpleITK,就是上图我圈起来的那个,所以安装MedPy库之前它会自动先把SimpleITK安装好。
但是!!众所不周知,我之前做其它项目的时候,早就通过pip安装好了2.0.0版本的SimpleITK,用都用过好几次了。而根据搜索,我知道MedPy依赖的SimpleITK的版本只要大于1.1.1就可以了,用我之前下好的完全没问题,为什么要去下2.0.2版本的,我开始考虑,是不是我现在安装的库的地方不是以前安装的库的地方,不然怎么会找不到我已经安装好了的库!
要验证也是很简单的,使用pip show [已经安装过的库名]就可以成功看到自己安装的库的相关信息啦,于是,于是我拿SimpleITK来试验,出现了下图的结果:
从上图可以知道,我确实是安装了2.0.0版本的SimpleITK的,而且通过Location大家可以看到它安装的位置,安装的位置是重点!!!
我们前面说过,两条代码之间的差矣仅在于一个数字3是吧,所以我要试试用pip3查看SimpleITK这个库,肯定有猫腻!
果然,这里查出来的就是我刚刚下载的2.0.2版本的SimpleITK,大彻大悟,原来它们安装的位置不一样,那为什么都是安装在Anaconda里面,在tensorflow环境里我却访问不到我安装的MedPy库呢?我们直接通过上面的库的存储位置来一探究竟。
在E盘的Anaconda3文件夹下(该文件夹是我的Anaconda安装的文件夹),有一个Lib文件夹,并且,与Lib文件夹处于同一层次的还有一个Python可执行文件,通过它的属性我们可以知道,该Python的版本为3.7.4
根据2.0.2版本所在的位置,我们可以轻松找到我们开篇就已经安装好了的MedPy库。
Version: 2.0.2
Location: e:\anaconda3\lib\site-packages
我们再来看一下我们自己创建的tensorflow环境在什么地方
进入到tensorflow环境的文件夹我们可以发现,它里面依然有Lib文件夹,我们可以进入与上面代码截图中的Location对应的位置看到我们2.0.0版本的SimpleITK库(这里就不放库的截图啦)。而且我们可以发现,在tensorflow环境里面有一个Python执行文件,在tensorflow环境里面我装的Python的版本是3.6.10。这是装的第二个Python。
现在我们可以发现:
由于我们在Anaconda中装了两个Python,虽然它们都是Python3,但是当我们使用pip安装的时候,这些库是安装在tensorflow环境里面的Lib库里面的,但是如果我们使用pip3,按照下图的方法,我们很容易发现这些库是安装在了Anaconda的base环境中。
插个题外话:那我们为什么会安装两个Python呢?首先我们安装Anaconda的时候是需要安装一个Python创建相应的Python环境的嘛,这个环境就对应我们最基础的base环境。当我们需要新的Python环境的时候,我们就会通过下面的命令创建一个新的环境(以创建tensorflow环境为例)。
conda create --name tendorflow python=3.6
通过上面的命令我们就创建了一个新的Python环境,该环境对应的Python版本为3.6,新的环境与原来的环境不相关,这样,我们就可以方便地在不同的应用中使用不同的Python版本。这就是为什么在E:\Anaconda3里面有一个Python.exe而在E:\Anaconda3\envs\tensorflow又有一个Python.exe,而且他们的版本可以是不一样的喔!
回到最开始的问题,为什么我明明安装成功了却无法成功在tensorflow环境import刚安装好的库呢?这下大家都明白了吧,用pip3你是安装在Anaconda的base环境里面而不是tensorflow环境呀,所以在tensorflow环境里面import当然不行啦,试着和上面的图一样切换到base环境就可以使用相应的库啦!
题外思考:如果你此刻在base环境,你要在base环境安装某些库,那你用pip和pip3有区别吗?
回答:经过试验,这是没有区别的,因为???我期待对pip、Anaconda了解更深的同学可以帮我解决一下这个问题。奇怪的大概就是pip、pip3、pip3.x这种是如何找到自己对应的存放的位置的?或者说我怎样可以不经试验就知道这个Python在这种情况下对应的是pip,另外一种情况对应的又是pip3?
但是同学们,我们一开始的初衷是什么,是安装到tensorflow环境对不对,现在算怎么回事,当然不行啊,于是我们继续整,前面发现两个Python环境的Python版本是不一样的嘛,tensorflow里面的是3.6,base的是3.7,所以我就想,不然我打pip3.6试试?
好嘛,又给我装了一遍SimpleITK,我知道了,又是一个新的位置。。。
为什么是这个位置呢,因为pip3.6对应的是我之前装的另外一个软件visual studio的位置,说明什么,说明之前装vs我们也是要装Python的,最后,保守估计,我这台电脑应该有不下于4个Python,它们可能是相同版本可能是不同版本,这真的很让人头大啊。
所以我们在每次安装东西的时候,如果你有多个Python,最好想清楚来自己要安装到哪里,在哪里用,不然东安装一下西安装一下,你会很乱的。有一个比较好的方法是在安装前先拿一个比较基本的库用pip show的命令看一看你用的这个pip[X]是安装到哪个位置,或者用pip[X] list看看这个pip下安装的是哪些库。当然,如果你只有一个Python,那它就只有一个安装位置不是,那谁管你用pip、pip3、pip3.6呢?现在回头看下面这幅图是不是更清楚了呢?
最后我是怎么在tensorflow环境装好MedPy库的呢?非常神奇,我好像什么都没干,第二天抱着试一试的心态输入开篇那条导致出现了很多错误的安装代码
pip install medpy -i https://pypi.tsinghua.edu.cn/simple
竟然顺利地安装好了!!Amazing、Unbelievable~
结果就是我终于可以在tensorflow环境正常使用MedPy库啦,左右弄了这么多我竟然不觉得烦,我想可能这就是这个学科在潜移默化地影响了我面对问题的态度吧,解决小问题解决几小时、一天、甚至是几天都是很正常的,而我也在慢慢探索在学科甚至是生活当中遇到问题、分析问题、解决问题的方法。
结语:此篇又臭又长,明明很简单的东西却要说这么多一是为了让自己记住这个过程,二是总会有些朋友想要更细致更有案例地看理论知识,希望此篇可以达到这样的目的。能看完的都是耐心的小可爱,祝大家生活越来越美好,文中写得不对的地方还请大家批评指正。
参考(感谢每一位让我习得新知识的大佬们):
1、pip原理及使用
2、pip和pip3的区别
3、Python:pip和pip3的区别