pip与Python包管理
本文最后更新于:2022年3月30日 早上
注意:本文所有命令行命令均为 Unix/macOS
适用,而非 Windows
pip 简述
pip 是 Python 的一个包(Package)管理器,用来安装和管理 Python 标准库之外的其他包(第三方包)。从 Python 3.4 起,pip 已经成为 Python 安装程序的一部分,也是官方的标准的 Python 包管理器。
检查(安装) pip
首先确保可以在命令行运行 Python:
1 |
|
然后检查是否可在命令行使用 pip:
1 |
|
对于 Ubuntu 等 Linux 发行版自带的 Python3,可能需要根据提示通过 apt 等工具安装 pip。
如果 pip 依然没有安装成功,可以尝试从标准库引导(这个命令有时也可以修复出现问题的 pip):
1 |
|
如果 pip 可用,可以先跳转到本文“升级包”一节查看升级 pip 的方法,将 pip 升级到最新版本。
安装包
从 PyPI 安装
安装最新版本的:
1 |
|
安装指定版本的:
1 |
|
安装大于等于某版本,且小于另一指定版本的:
1 |
|
安装与特定版本兼容的版本:
1 |
|
这种情况下,会安装版本为 ==1.4.*
且 >=1.4.2
的。
使用 PyPI 镜像站
由于直接使用 pip 从 PyPI 上安装时,需要从国外的服务器下载数据,网络连接速度往往较慢,常会出现下载安装失败的情况。
一种解决办法是手动设置 socket 超时时间(默认15秒)和断开重连尝试次数(默认5次):
1 |
|
另一个更好的方法是从国内的镜像站下载包文档。
以清华大学开源软件镜像站为例:
临时使用(只对这一次安装有效)
1 |
|
使用该镜像站升级 pip:
1 |
|
设为默认下载源:
1 |
|
会将该配置写入到用户目录下的 /pip/pip.conf 文件中,例如在我的机器上:
1 |
|
查看 pip.conf 的内容,可以看到写入的内容
1 |
|
升级包
升级包到最新版本的命令如下:
1 |
|
这个命令也可以用于升级 pip 、setuptools、wheel 到最新版本
1 |
|
虽然单独使用 pip 就可以实现从预构建的二进制归档(pre-built binary archives)安装,但使用最新版本的 setuptools 和 wheel 使你也能够从源文件(source archives)安装
Requirement Files
在 GitHub 上克隆他人的 Python 项目时,常常会有一个 requirements.txt
文件,Pycharm 也会提醒我们,是否根据该文件创建虚拟环境并安装包。其实这个文件里面就列出了该项目所使用的所有第三方 Python 包及其版本信息。我们在写自己的 Python 项目时也应创建一个文本文件,写明项目的包依赖,并根据惯例命名为 requirements.txt 。
从 requirements 安装
打开已有 requirements.txt 的项目,使用如下命令安装需求文件中指定的包:
1 |
|
生成 requirements
在写自己的 Python 项目时,如果想要创建依赖文件,可以使用下面的命令:
1 |
|
直接使用 pip freeze
命令的缺点是,会把当前 Python 环境中所有已安装的包都列出来,而不管这些包是否被 import 引入使用。为解决此问题,可以使用 pipreqs 一类的第三方库来生成 requirements:
1 |
|
微调需求
有时我们并不需要指定第三方包的版本严格等于(hardcoding)目前使用的版本
一般来讲,包都是向后兼容的,且新版本的包往往有修复 bug 、提升性能等优化,我们希望可以安装更新版本的包。
但也有一些情况,太新版本的包可能会出现问题,如对旧版本不兼容的更改(可能出现在大的版本号更新时)、破坏包之间的依赖关系等。例如,假设未来某天 requests 包推出了3.0版本,且语法和目前的 2.* 不相同,就会让现有的项目出现问题,因此需要避免。
可以在 requirements 文件中使用逻辑运算符,较为灵活的控制包的版本。
例如,在编辑器中打开 requirements.txt 文件,并进行如下修改:
1 |
|
再使用 pip 安装或升级包时,就会按照此要求安装指定范围内的最新版本。
生产环境 vs 开发环境
由于生产环境和开发环境的不同,对有些包的需求也不同。开发环境中往往安装了更多用于测试等功能的辅助性包,这些包在生产环境中是不需要的。我们可以通过在需求文件中嵌套需求文件的方法来解决这个问题:
创建第二个 requirements 文件(requirements_dev.txt)来列出创建开发环境所需要的其他工具,例如:
1 |
|
由于 pip 允许在 requirements 文件中指定其他参数,所以可以在其中加上一行 -r requirements.txt
。
这时直接使用
1 |
|
就可以安装所有开发环境所需要的包了。
而此时在生产环境继续使用命令:
1 |
|
就不会安装 pytest ,保持了生产环境的轻量可靠。
依赖库管理工具
- https://github.com/bndr/pipreqs
- https://github.com/jazzband/pip-tools
- https://github.com/damnever/pigar
- https://github.com/naiquevin/pipdeptree
寻找包
pip 命令行
可以使用 pip search
命令搜索包,下面列出了该命令的 help 文档
1 |
|
PyPI 网页
然而相比在命令行工具进行搜索,只能看到包的简短描述信息,更好的方法是在浏览器中打开 PyPI 网页,搜索查看包的详细信息。
社区论坛
另外,多关注社区动态、博主分享、Python 公众号等,多逛逛 GitHub ,往往能收藏到很多强大易用的优秀 Python 包。
卸载包
检查依赖关系
在卸载包之前,请先运行 pip show
命令检查该包:
1 |
|
例如:
1 |
|
注意最后的两个字段 Requires 和 Required-by 。可以看到,在我的机器上 PyQt5 包依赖于 PyQt5-Qt5 和 PyQt5-sip 这两个包,如果卸载它们,则 PyQt5 也就不能正常使用了。没有任何包依赖于 PyQt5,因此直接卸载 PyQt5 是安全的。
卸载
卸载命令:
1 |
|
卸载包时会显示要删除的文件,并要求确认。如果已经在上一步中检查确认了该包是可以删除的(没有被其他包依赖),那么可以加上一个 -y
选项来跳过显示文件列表和确认:
1 |
|
也可以在一行命令中卸载多个包,包名之间用空格隔开即可:
1 |
|
还可以通过 -r <requirments file>
选项来卸载 requirements 中列出的所有包,当检查确认不会破坏其他依赖关系后,运行下面的命令:
1 |
|
pip help 信息
在这里列出了命令行 pip help
返回的帮助信息,并尽我所能做了简单翻译。
使用 pip help <command>
命令查看某个命令的具体帮助。
1 |
|
在 Pycharm 中进行包管理
不同版本 Pycharm 界面可能有微小差异,这里以 Pycharm Community 2021.2.2 为例。
查看已安装的包
在设置中找到“项目 —— Python 解释器”,即可查看已经安装的包、包的版本、包的最新版本。
升级包、卸载包
在这个界面选中某个包之后,点击升级(向上三角)按钮、卸载(减号)按钮即可。
更换 PyPI 镜像源
这里通过图形界面列出的各种包信息,其实还是默认从https://pypi.python.org/simple 源获取的信息,所以可能加载很慢,必要时可以更换为国内镜像源。
先点击安装包的按钮(卸载包、升级包按钮左边那个加号按钮),进入安装包的界面
在这个界面点击左下角“管理仓库”
在这里点击左上角加号添加其他源,或直接把默认的 https://pypi.python.org/simple 改为其他源
这是我的配置,只设置了一个清华镜像站的源。
安装包
完成更换镜像源之后,就可以安装包了。在搜索框内输入想要安装的包,会列出许多搜索结果,可以一一点开查看包描述,然后安装我们需要的那个,还可以手动勾选安装指定版本。
参考文档
- Python 软件包用户指南:安装 Python 分拨包
- What Is Pip? A Guide for New Pythonistas - Real Python
- PyPI - The Python Package Index
- 清华大学开源软件镜像站 pypi 镜像使用帮助
扩展
除了 pip,还有一些其他 Python 包管理(虚拟环境管理)工具。
Conda
如果你使用过 Anaconda,那么一定不会对 Conda 包管理器感到陌生。Conda 是包括 Python 在内的许多语言的包、依赖项和环境的管理器,广泛应用于数据科学和机器学习领域。
Pipenv
许多人将其推崇为“最好用的 Python 虚拟环境与包管理工具”。
TODO 完善介绍
Poetry
更多内容可查看本站另一篇文章:使用 Python Poetry 进行依赖项管理
pipX
在隔离环境中安装和运行 Python 应用
用于安装 Python 命令行工具,类似 apt 。(面向应用,将Python应用安装在一个隔离的环境中,但是应用可以命令行全局访问)
TODO
碎碎念与更新记录
2021-09-16
- 学习 Python 也有一段时间了,对最最重要的
pip
工具的掌握却依然停留在pip install XXX
的程度,惭愧惭愧。后面有时间也许再整理一篇关于 Python-虚拟环境 的博客。 - 大三上,忙于车辆工程的专业课程,闲暇时间进一步缩减。没有大段时间来写代码、做项目,就延续前半年的思路,利用碎片时间,多整理总结一些编程上的小技巧、语言细节(我爱Python)、实用工具等等,多更新一些博客。
- PyPI 读音为 Pie Pea Eye 。
2021-09-20
- 更新:增加“扩展”一节,搜集与 Python 包管理有关的各种资料。书到用时方恨少,不如提前就做些搜集工作,积累各种可能用得上的工具、技术。
2021-10-29
- 更新:增加“依赖库管理工具”一节