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-release
lsb_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