pip与Python包管理

本文最后更新于:2022年3月30日 早上

注意:本文所有命令行命令均为 Unix/macOS 适用,而非 Windows

PyPI 是 Python Package Index 的缩写

pip 简述

pip 是 Python 的一个包(Package)管理器,用来安装和管理 Python 标准库之外的其他包(第三方包)。从 Python 3.4 起,pip 已经成为 Python 安装程序的一部分,也是官方的标准的 Python 包管理器。

检查(安装) pip

首先确保可以在命令行运行 Python:

1
python3 --version

然后检查是否可在命令行使用 pip:

1
python3 -m pip --version

对于 Ubuntu 等 Linux 发行版自带的 Python3,可能需要根据提示通过 apt 等工具安装 pip。

如果 pip 依然没有安装成功,可以尝试从标准库引导(这个命令有时也可以修复出现问题的 pip):

1
python3 -m ensurepip --default-pip

如果 pip 可用,可以先跳转到本文“升级包”一节查看升级 pip 的方法,将 pip 升级到最新版本。

安装包

从 PyPI 安装

安装最新版本的:

1
python3 -m pip install "SomeProject"

安装指定版本的:

1
python3 -m pip install "SomeProject==1.4"

安装大于等于某版本,且小于另一指定版本的:

1
python3 -m pip install "SomeProject>=1,<2"

安装与特定版本兼容的版本:

1
python3 -m pip install "SomeProject~=1.4.2"

这种情况下,会安装版本为 ==1.4.*>=1.4.2 的。

使用 PyPI 镜像站

由于直接使用 pip 从 PyPI 上安装时,需要从国外的服务器下载数据,网络连接速度往往较慢,常会出现下载安装失败的情况。

一种解决办法是手动设置 socket 超时时间(默认15秒)和断开重连尝试次数(默认5次):

1
python3 -m pip install pyqt5 --timeout 120 --retries 10  # 超时时间120秒,重试10次

另一个更好的方法是从国内的镜像站下载包文档。

清华大学开源软件镜像站为例:

临时使用(只对这一次安装有效)

1
python3 -m pip install -i https://pypi.tuna.tsinghua.edu.cn/simple some-package

使用该镜像站升级 pip:

1
python3 -m pip install -i https://pypi.tuna.tsinghua.edu.cn/simple pip -U

设为默认下载源

1
python3 -m pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple

会将该配置写入到用户目录下的 /pip/pip.conf 文件中,例如在我的机器上:

1
2
$ python3 -m pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple
Writing to /home/muzing/.config/pip/pip.conf

查看 pip.conf 的内容,可以看到写入的内容

1
2
3
$ cat ~/.config/pip/pip.conf 
[global]
index-url = https://pypi.tuna.tsinghua.edu.cn/simple

升级包

升级包到最新版本的命令如下:

1
python3 -m pip install --upgrade SomeProject

这个命令也可以用于升级 pip 、setuptools、wheel 到最新版本

1
python3 -m pip install --upgrade pip setuptools wheel # 如果下载速度太慢,请参看上一节使用镜像站

虽然单独使用 pip 就可以实现从预构建的二进制归档(pre-built binary archives)安装,但使用最新版本的 setuptools 和 wheel 使你也能够从源文件(source archives)安装

Requirement Files

在 GitHub 上克隆他人的 Python 项目时,常常会有一个 requirements.txt 文件,Pycharm 也会提醒我们,是否根据该文件创建虚拟环境并安装包。其实这个文件里面就列出了该项目所使用的所有第三方 Python 包及其版本信息。我们在写自己的 Python 项目时也应创建一个文本文件,写明项目的包依赖,并根据惯例命名为 requirements.txt 。

从 requirements 安装

打开已有 requirements.txt 的项目,使用如下命令安装需求文件中指定的包:

1
python3 -m pip install -r requirements.txt

生成 requirements

在写自己的 Python 项目时,如果想要创建依赖文件,可以使用下面的命令:

1
python3 -m pip freeze > requirements.txt

直接使用 pip freeze 命令的缺点是,会把当前 Python 环境中所有已安装的包都列出来,而不管这些包是否被 import 引入使用。为解决此问题,可以使用 pipreqs 一类的第三方库来生成 requirements:

1
2
python3 -m pip install pipreqs # 安装 pipreqs
pipreqs <Project_Dic> --encoding=utf-8 # 生成 requirements,将 <Project_Dic> 替换为你的项目路径

微调需求

有时我们并不需要指定第三方包的版本严格等于(hardcoding)目前使用的版本

一般来讲,包都是向后兼容的,且新版本的包往往有修复 bug 、提升性能等优化,我们希望可以安装更新版本的包。

但也有一些情况,太新版本的包可能会出现问题,如对旧版本不兼容的更改(可能出现在大的版本号更新时)、破坏包之间的依赖关系等。例如,假设未来某天 requests 包推出了3.0版本,且语法和目前的 2.* 不相同,就会让现有的项目出现问题,因此需要避免。

可以在 requirements 文件中使用逻辑运算符,较为灵活的控制包的版本。

例如,在编辑器中打开 requirements.txt 文件,并进行如下修改:

1
2
3
4
5
certifi>=2018.11.29
chardet>=3.0.4
idna>=2.8
requests>=2.21.0, <3.0
urllib3>=1.24.1

再使用 pip 安装或升级包时,就会按照此要求安装指定范围内的最新版本。

生产环境 vs 开发环境

由于生产环境和开发环境的不同,对有些包的需求也不同。开发环境中往往安装了更多用于测试等功能的辅助性包,这些包在生产环境中是不需要的。我们可以通过在需求文件中嵌套需求文件的方法来解决这个问题:

创建第二个 requirements 文件(requirements_dev.txt)来列出创建开发环境所需要的其他工具,例如:

1
2
3
# In requirements_dev.txt
-r requirements.txt
pytest>=4.2.0

由于 pip 允许在 requirements 文件中指定其他参数,所以可以在其中加上一行 -r requirements.txt

这时直接使用

1
python3 -m pip install -r requirements_dev.txt

就可以安装所有开发环境所需要的包了。

而此时在生产环境继续使用命令:

1
python3 -m pip install -r requirements.txt

就不会安装 pytest ,保持了生产环境的轻量可靠。

依赖库管理工具

寻找包

pip 命令行

可以使用 pip search 命令搜索包,下面列出了该命令的 help 文档

1
2
3
4
5
6
7
8
9
10
11
$ pip3 help search

Usage:
pip3 search [options] <query>

Description:
Search for PyPI packages whose name or summary contains <query>.

Search Options:
-i, --index <url> Base URL of Python Package Index (default
https://pypi.org/pypi)

PyPI 网页

然而相比在命令行工具进行搜索,只能看到包的简短描述信息,更好的方法是在浏览器中打开 PyPI 网页,搜索查看包的详细信息。

PyPI网页上的requests项目首页

社区论坛

另外,多关注社区动态、博主分享、Python 公众号等,多逛逛 GitHub ,往往能收藏到很多强大易用的优秀 Python 包。

卸载包

检查依赖关系

在卸载包之前,请先运行 pip show 命令检查该包:

1
python3 -m pip show [package-name]  # 检查 [package name] 的信息

例如:

1
2
3
4
5
6
7
8
9
10
11
$ pip3 show pyqt5
Name: PyQt5
Version: 5.15.4
Summary: Python bindings for the Qt cross platform application toolkit
Home-page: https://www.riverbankcomputing.com/software/pyqt/
Author: Riverbank Computing Limited
Author-email: info@riverbankcomputing.com
License: GPL v3
Location: /usr/local/lib/python3.8/dist-packages
Requires: PyQt5-Qt5, PyQt5-sip
Required-by:

注意最后的两个字段 Requires 和 Required-by 。可以看到,在我的机器上 PyQt5 包依赖于 PyQt5-Qt5 和 PyQt5-sip 这两个包,如果卸载它们,则 PyQt5 也就不能正常使用了。没有任何包依赖于 PyQt5,因此直接卸载 PyQt5 是安全的。

卸载

卸载命令:

1
pip3 uninstall [package-name]

卸载包时会显示要删除的文件,并要求确认。如果已经在上一步中检查确认了该包是可以删除的(没有被其他包依赖),那么可以加上一个 -y 选项来跳过显示文件列表和确认:

1
python3 -m pip uninstall [package-name] -y

也可以在一行命令中卸载多个包,包名之间用空格隔开即可:

1
python3 -m pip uninstall [package-name-1] [package-name-1] [package-name-1]

还可以通过 -r <requirments file> 选项来卸载 requirements 中列出的所有包,当检查确认不会破坏其他依赖关系后,运行下面的命令:

1
python3 -m pip uninstall -r requirements.txt -y

pip help 信息

在这里列出了命令行 pip help 返回的帮助信息,并尽我所能做了简单翻译。

使用 pip help <command> 命令查看某个命令的具体帮助。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
$ pip3 help

Usage:
pip3 <command> [options]

Commands:
install 安装包
download 下载包(只下载不安装)
uninstall 卸载包
freeze 以 requirements 格式列出所有依赖包
list 列出所有已安装的包
show 显示已安装包的信息
check 验证已安装的包是否具有兼容的依赖项
config 管理本地和全局配置
search 在 PyPI 中搜索包
cache 检查和管理 pip 的 wheel 缓存
index 检索包索引中的可用信息
wheel 为你的 requirements 构建 wheel
hash 计算包档案的 hash 值
completion A helper command used for command completion.
debug 显示对 debug 有用的信息
help 显示命令的帮助

General Options:
-h, --help 显示帮助
--isolated 以隔离模式运行 pip ,忽略环境变量和用户配置
-v, --verbose 显示更多的输出。此选项可累加,且最多3次
-V, --version 显示版本并退出
-q, --quiet 显示更少的输出。 此选项可累加,且最多三次 (对应于 WARNING,
ERROR, 和 CRITICAL logging 等级)
--log <path> 附加详细日志的路径
--no-input 禁用提示输入
--proxy <proxy> 使用该形式指定代理:
[user:passwd@]proxy.server:port
--retries <retries> 每个连接尝试重新连接的最大次数(默认为5次)
--timeout <sec> 设置 socket 超时时间(默认15秒)
--exists-action <action> 路径已存在时的默认操作:
(s)witch, (i)gnore, (w)ipe, (b)ackup, (a)bort
--trusted-host <hostname> 标记此 host 或 host:port 为受信任的,
即使它没有有效的HTTPS, 甚至没有 HTTPS
--cert <path> PEM-encoded CA certificate bundle 的路径
如果提供了该项,则覆盖默认值
查看 pip 文档中的 'SSL Certificate Verification'
以查看更多信息
--client-cert <path> SSL 客户端证书的路径,
一个单独的包含私钥和 PEM 格式证书的单个文件
--cache-dir <dir> 将缓存数据存储在 <dir> 中
--no-cache-dir 禁用缓存
--disable-pip-version-check 不要定期检查 PyPI 以确认是否有新版本 pip 可下载。
使用 --no-index 关闭提示
--no-color 关闭彩色输出
--no-python-version-warning 关闭 即将不受支持的 Python 的警告
--use-feature <feature> 启用可能向后不兼容的新功能
--use-deprecated <feature> 启用将在未来被移除的已弃用功能

在 Pycharm 中进行包管理

不同版本 Pycharm 界面可能有微小差异,这里以 Pycharm Community 2021.2.2 为例。

查看已安装的包

在设置中找到“项目 —— Python 解释器”,即可查看已经安装的包、包的版本、包的最新版本。

查看已安装的包

升级包、卸载包

在这个界面选中某个包之后,点击升级(向上三角)按钮、卸载(减号)按钮即可。

卸载或升级包

更换 PyPI 镜像源

这里通过图形界面列出的各种包信息,其实还是默认从https://pypi.python.org/simple 源获取的信息,所以可能加载很慢,必要时可以更换为国内镜像源。

先点击安装包的按钮(卸载包、升级包按钮左边那个加号按钮),进入安装包的界面

列出所有可用包的界面,在这里点击“管理仓库”

在这个界面点击左下角“管理仓库”

管理仓库界面

在这里点击左上角加号添加其他源,或直接把默认的 https://pypi.python.org/simple 改为其他源

这是我的配置,只保留了一个清华镜像站的源

这是我的配置,只设置了一个清华镜像站的源。

安装包

完成更换镜像源之后,就可以安装包了。在搜索框内输入想要安装的包,会列出许多搜索结果,可以一一点开查看包描述,然后安装我们需要的那个,还可以手动勾选安装指定版本。

安装包

参考文档

扩展

除了 pip,还有一些其他 Python 包管理(虚拟环境管理)工具。

Conda

Conda

如果你使用过 Anaconda,那么一定不会对 Conda 包管理器感到陌生。Conda 是包括 Python 在内的许多语言的包、依赖项和环境的管理器,广泛应用于数据科学和机器学习领域。

Pipenv

Pipenv

Pipenv 官网

Pipenv GitHub 首页

许多人将其推崇为“最好用的 Python 虚拟环境与包管理工具”。

TODO 完善介绍

Poetry

Poetry

Poetry 官网

Poetry GitHub 首页

更多内容可查看本站另一篇文章:使用 Python Poetry 进行依赖项管理

pipX

pipX

pipX - PyPI 首页

pipX - 文档

在隔离环境中安装和运行 Python 应用

用于安装 Python 命令行工具,类似 apt 。(面向应用,将Python应用安装在一个隔离的环境中,但是应用可以命令行全局访问)

TODO

碎碎念与更新记录

2021-09-16

  1. 学习 Python 也有一段时间了,对最最重要的 pip 工具的掌握却依然停留在 pip install XXX 的程度,惭愧惭愧。后面有时间也许再整理一篇关于 Python-虚拟环境 的博客。
  2. 大三上,忙于车辆工程的专业课程,闲暇时间进一步缩减。没有大段时间来写代码、做项目,就延续前半年的思路,利用碎片时间,多整理总结一些编程上的小技巧、语言细节(我爱Python)、实用工具等等,多更新一些博客。
  3. PyPI 读音为 Pie Pea Eye

2021-09-20

  1. 更新:增加“扩展”一节,搜集与 Python 包管理有关的各种资料。书到用时方恨少,不如提前就做些搜集工作,积累各种可能用得上的工具、技术。

2021-10-29

  1. 更新:增加“依赖库管理工具”一节

pip与Python包管理
https://muzing.top/posts/594ac4a6/
作者
muzing
发布于
2021年9月16日
更新于
2022年3月30日
许可协议