我用的是哪个python
python版本
python2
:目前主要是python2.7
,已停止继续更新版本号
python3
:目前主流python
,建议学习并使用该版本
正在使用的是哪个python
在linux
系统下,有时我们安装了多个python
,例如,系统自带的python
包,自行安装的python2
,python3
,包括安装anaconda
时安装的python
。有时候想升级python
版本,发现安装了指定版本后,终端默认python
版本依旧是之前的版本。
问题1:当我们在终端使用python
时,用的是哪个python
?
问题2:如何使用指定的python
?
问题3:使用pip
安装python
第三方包之后,到底安装到哪里去了?
问题1
linux
相对windows
在安装包管理上存在明显区别是:windows
对每个安装的软件,都需要注册,这样相同的软件就不可能在windows
上安装两个不同的版本。而linux
则没有这个限制,理论上在linux
上安装100个python
都是没有问题的。
那么既然如此,linux
上是如何选择当前用的是哪个python
呢?这里就涉及到一个linux
系统基本的搜索可执行二进制(命令)的逻辑了。
1、首先在命令执行的当前文件夹下搜索。(并不会)
2、如果没有,那么安装系统变量PATH
指定的路径进行搜索。
linux
下可以用命令which 命令name
得到命令所在的路径。但不一定是真实运行时的二进制所在的路径,例如 which python
仅根据PATH
中的顺序查询python
,但有可能真实使用的python
并非which python
给出的结果。相对而言type python
比 which python
更准确。
为什么which python
有时不准确呢?
因为linux bash
使用内部哈希表来优化PATH
查找(说白了就是有些情况下PATH
有缓存,bash
首先拿到的是缓存中的PATH
,修改了PATH
之后缓存并没有随之实时更新)。这就导致新安装一个python
,之前的系统中已有python
,虽然新安装python
时同时修改了PATH
,甚至将新python
对应的路径放在PATH
的头部,bash
却不知道发生了什么,因为bash
使用的PATH
有缓存。所以bash
继续使用旧python
。这就导致which python
按PATH
搜索到的路径并不一定是真实运行的python
路径了。
当然,这个问题好解决,重启后就没有缓存了。
或者,运行该命令hash -d python
,这将python
从bash
的哈希表中删除,下次调用python
时必定要搜索PATH
,那就符合预期了。
再或者,运行hash -r
以完全清除哈希表。
查询全部python
所在的路径:whereis python
问题2
有很多时候,我们就是想使用指定的python
版本,然后安装指定的第三方库。然后不知道如何操作,一顿百度谷歌之后,发现没什么效果。问题在哪里呢?一定是没搞清楚原理啦。
系统默认安装的python
常用路径/usr/bin/python
anaconda
的python
所在路径~/anaconda3/bin/python
自行安装python
的默认路径一般是/usr/local/lib/python
为了让自己清楚知道自己的python
装到哪里去了,可以在安装时指定安装路径。
编译源码时加上./configure --prefix=/users/my/python
就能将python
安装到指定路径/users/my/python
。然后在PATH
的头部加上路径/users/my/python
。解决掉PATH
缓存问题,就可以达到目的了。
还有一种方式,有兴趣可以试试:update-alternatives多个python时可修改优先级
。
问题3
pip
是python
的包管理工具,pip
将包安装到哪个python
目录下,取决于用的是哪个pip
,用的是哪个pip
和上面用的是哪个python
道理相同。(easy_install
,get-pip.py
都是python
安装包的工具)
pip list
查看已安装的包名
pip show包名
就可以看到安装到哪了
安装在对应python
的安装路径下的lib/site-packages
中,见下图:
pip
和python
均位于python
安装路径下的bin
中,在该路径下使用pip list
可查询出该python
安装了哪些第三方库。
pip
安装包时,根据名称从python第三方库管理平台查找指定包,如果查询到,则下载后安装。
还可以下载.whl
包到本地后进行安装。
或者自己写的代码,使用pip install .
进行安装。
实践了下,linux
查找可执行命令时完全是按PATH
来的,不会先搜索当前目录,除非PATH
中配置了当前目录。当前目录下运行程序一般是 ./python
才行。这样明确指定了路径,未明确指定路径都是搜索PATH
。