Bootstrap

PythonX.X、pipX的关系

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 pipwhich pip3是查找不到的,也就是说系统中并未按照包管理工具。

安装pip3:

sudo apt install python3-pip

这时再which pipwhich pip3 发现会检索到 usr/bin 目录下,说明我们已经成功安装了可执行脚本,并且放到了环境变量中。

可执行脚本:

我们cat下这两个文件:发现只有load_entry_point()中的最后一个参数不同。并且都是由python3这个解释器来运行这个脚本,而python3是个软链接指定了某个版本的python,笔者系统默认是python3.8。

在这里插入图片描述

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

在这里插入图片描述

此时发现在笔者的系统中,无论是pippip3pip3.8其实都是等价的,都是调用一个方法。

总结:ubuntu20.04中,pippip3pip3.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

;