PythonX.X、pipX的关系
Python2.x 与 3.x
Python 的 3.0 版本,相对于 Python 的早期版本,是一个大的升级。许多针对早期 Python2.x 版本设计的程序都无法在 Python 3.x 上正常执行。为了照顾大量的历史遗留项目,Python 2.6 作为一个过渡版本,基本使用了 Python 2.x 的语法和库,同时考虑了向 Python 3.x 的迁移,允许使用部分 Python 3.x 的语法与函数。新的 Python 程序官方建议使用 Python 3.x版本,Python 2默认使用ASCII编码,而Python 3使用UTF-8编码,并原生支持Unicode字符。
本文将在Ubuntu20.04中,侧重介绍python3.x和pip
Ubuntu各版本内置Python的情况
- Ubuntu 20.04 LTS(Focal Fossa):内置Python 3.8版本。
- Ubuntu 18.04 LTS(Bionic Beaver):内置Python 2.7和Python 3.6版本。
- Ubuntu 16.04 LTS(Xenial Xerus):内置Python 2.7和Python 3.5版本。
从Ubuntu 20.04 LTS开始,Ubuntu已经默认将Python 2.x版本从系统中移除,并且将Python 3.x版本作为默认的Python版本。这是因为Python 2.x版本已于2020年1月1日终止支持,官方建议用户尽快迁移到Python 3.x版本。
查看Linux的发行版本(两种方式):
cat /etc/os-releaselsb_release -a
Python解释器的相关路径
python3 相关路径:
- 解释器路径:/usr/bin/python3(可以通过which python3查看)
- 标准库路径:/usr/lib/python3.X/(其中X是Python 3的具体小版本号,例如3.8)
- 第三方库路径(通过pip安装):/usr/local/lib/python3.X/dist-packages/或~/.local/lib/python3.X/site-packages/
python2 相关路径:
- 解释器路径:/usr/bin/python2(注意:在较新版本的Ubuntu中,Python 2可能已经被移除,因此这个路径可能不存在)
- 标准库路径:/usr/lib/python2.X/(其中X是Python 2的具体小版本号,例如2.7)
- 第三方库路径(通过pip安装):/usr/local/lib/python2.X/dist-packages/或~/.local/lib/python2.X/site-packages/
对于笔者使用的Ubuntu20.04是不存在python2相关路径的,python3的解释器和标准库的路径如上所述,至于第三方库路径之所以会有两个后续会介绍。
Python版本查看方式
-  方式一:通过命令查看 python3 --version
-  方式二:通过解释器安装路径上的文件链接关系查看 ll /usr/bin/ | grep "python3"

因为笔者使用的Ubuntu20.04,预安版本为python3.8。
pip与pip3
  pip是一个Python包管理工具,提供了对Python包的查找、下载、安装、卸载的功能,但它本身也是一个 Python 包。pip 的设计就是为了管理其他 Python 包,同时它自己也作为一个标准的 Python 包进行分发和安装。
  pip和pip3是/usr/bin下的可执行脚本。
现在对于pip、pip3、包、脚本有些混乱属于正常现象,接下来慢慢梳理。
在笔者的Ubuntu20.04的初始环境下,which pip和which pip3是查找不到的,也就是说系统中并未按照包管理工具。
安装pip3:
sudo apt install python3-pip
这时再which pip 和 which pip3 发现会检索到 usr/bin 目录下,说明我们已经成功安装了可执行脚本,并且放到了环境变量中。
可执行脚本:
我们cat下这两个文件:发现只有load_entry_point()中的最后一个参数不同。并且都是由python3这个解释器来运行这个脚本,而python3是个软链接指定了某个版本的python,笔者系统默认是python3.8。

让我们进一步看一下load_entry_point()这个方法:

此时发现在笔者的系统中,无论是pip、pip3、pip3.8其实都是等价的,都是调用一个方法。
总结:ubuntu20.04中,
pip、pip3、pip3.8是等价的,都会调用同一个方法,并且都由python3.8解释器执行,也就是管理的是python3.8的包。
包管理工具/包: 通过pip list 查看,我们发现pip确实是python的一个特殊的包。注意没有pip3这个包。
luzelin@ubuntu:~$ pip list | grep pip
pip                    20.0.2
查看某个依赖包的信息:
pip3 show XXX
安装依赖:
- 方式一:安装到~/.local/lib/python3.X/site-packages/
pip3 install XXX
例如,pip3 install Pandas 后, 通过pip3 show Pandas 命令查看依赖包安装位置:

- 方式二:安装到/usr/local/lib/python3.X/dist-packages/
sudo pip3 install XXX
例如, sudo pip3 install Matplotlib 后,通过pip3 show Matplotlib 命令查看依赖包安装位置:

两种方式的区别:
当切换到另一个用户时,再查看这两个包的信息,此时发现用户级的安装(方式一)仅限于安装用户使用,而系统级的安装(方式二)可以各用户共享。
安装/切换多版本python
安装指定版本python: 以3.9举例
sudo apt install python3.9
安装完成后,发现使用python3 命令默认还是3.8,这是因为/usr/bin/python3 这个软链接文件的指向没有发生修改。
修改默认python3 命令的版本:(不推荐)
  可以通过修改/usr/bin/python3这个软链接来指向新的Python版本。但是,这样做可能会导致系统级脚本和依赖Python 3的应用程序出现问题,这里只是为了文章效果演示,强烈不建议这样做!
cd /usr/bin/
sudo rm python3
sudo ln -s python3.9 python3
可以明确,我们执行的python3其实就是在/usr/bin这个环境变量目录下的软链接。

建议通过指定路径的形式,切换使用不同版本的python
使用特定的 Python 版本来调用 pip:
给指定解释器安装pip包管理工具,如python3.9:
python3.9 -m ensurepip --upgrade
直接调用了 Python 3.9 自带的 pip 模块:
python3.9 -m pip install XXX
因为python默认指向的是python3.8,所以以下两种方式是等价的
python3.8 -m pip install xxx
pip install xxx




















