02 pip 与包管理基础------你的第一个包管理工具
「Python 包管理全攻略」系列第二篇。Python 装好了,接下来该学学怎么装第三方库了。
pip 是什么?
一句话:pip 就是 Python 的应用商店。
你想装个 requests 发 HTTP 请求?pip install requests。想用 pandas 处理数据?pip install pandas。几乎所有你在网上看到的 Python 第三方库,都可以通过 pip 安装。
pip 从 Python 3.4 开始就自带了,不用额外安装。如果你用的是上篇文章提到的方式装的 Python,pip 应该已经就绪了。
基础操作,必须熟练
安装包
bash
# 基本安装
pip install requests
# 指定版本
pip install requests==2.31.0
# 版本范围
pip install "requests>=2.28.0,<3.0.0"
# 装最新版
pip install --upgrade requests
这里有个小细节:写版本范围的时候最好加引号。因为 < 和 > 在 shell 里是重定向符号,不加引号会出问题。这个坑不少老手也会踩。
卸载包
bash
pip uninstall requests
会问你确认,输入 y 就行。如果你想跳过确认(比如在脚本里用),加 -y 参数。
查看已安装的包
bash
# 列出所有已安装的包
pip list
# 查看某个包的详细信息
pip show requests
# 看看哪些包有更新
pip list --outdated
pip show 特别实用,它会告诉你这个包装在哪、版本号、依赖了谁、被谁依赖。排查问题的时候经常用到。
搜索包?
以前有个 pip search 命令,但 2020 年底 PyPI 把它关了(因为被滥用),到现在也没恢复。想找包直接去 pypi.org 网站搜就行。
requirements.txt:项目依赖的基石
你在本地开发得好好的项目,发给同事跑不起来------八成是依赖没装全。requirements.txt 就是解决这个问题的。
手动创建
text
# requirements.txt
requests==2.31.0
pandas==2.1.4
flask>=3.0.0
numpy
写法很简单,一行一个包,可以指定版本号,也可以不指定。
生成和使用
bash
# 把当前环境的所有包导出到文件
pip freeze > requirements.txt
# 根据文件安装所有依赖
pip install -r requirements.txt
pip freeze 的问题
pip freeze 会把你环境里所有包都导出来,包括间接依赖(依赖的依赖)。这会导致 requirements.txt 里面有一大堆你根本不直接使用的包。
更好的做法: 手动维护一个精简的 requirements.txt,只写你直接依赖的包和版本。然后用 pip-tools 这样的工具来自动管理完整的依赖树:
bash
pip install pip-tools
# 1. 你只需要维护 requirements.in(直接依赖)
echo "flask" > requirements.in
echo "requests" >> requirements.in
# 2. pip-compile 自动生成完整的 requirements.txt(含所有间接依赖和版本锁定)
pip-compile requirements.in
# 3. 安装
pip-sync requirements.txt
pip-sync 比 pip install -r 更好用------它不仅会安装缺失的包,还会卸载 requirements.txt 里没有的包,确保环境和文件完全一致。
PyPI 与镜像源
pip 默认从 PyPI(Python Package Index,地址是 pypi.org)下载包。PyPI 服务器在国外,国内下载速度经常很慢。
换国内镜像源
bash
# 临时使用
pip install requests -i https://mirrors.aliyun.com/pypi/simple/
# 永久设置(推荐)
pip config set global.index-url https://mirrors.aliyun.com/pypi/simple/
常用的国内镜像:
- 阿里云:
https://mirrors.aliyun.com/pypi/simple/ - 清华:
https://pypi.tuna.tsinghua.edu.cn/simple/ - 腾讯:
https://mirrors.cloud.tencent.com/pypi/simple/ - 华为:
https://repo.huaweicloud.com/repository/pypi/simple/
选一个你网络环境下速度快的就行,内容都一样。
信任主机问题
有些镜像源用 HTTP 而不是 HTTPS,pip 会报不安全警告。加上 trusted-host 就行:
bash
pip config set global.trusted-host mirrors.aliyun.com
几个实用但容易被忽略的技巧
1. 只看不装(dry-run)
bash
pip install --dry-run "django>=5.0"
这个命令会模拟安装过程,告诉你将会装哪些包、哪些依赖会被升级,但不会真的执行。在升级大包之前先用 dry-run 看看影响范围,是个好习惯。
2. 安装本地包
bash
# 从本地 whl 文件安装
pip install ./package-1.0-py3-none-any.whl
# 从本地目录安装(开发模式)
pip install -e ./my-package/
-e 是可编辑模式(editable),装了之后修改源码会立即生效,不用反复重装。开发自己的库时特别有用。
3. 查看包的依赖树
pip 本身不能直接看依赖树,但可以装个 pipdeptree:
bash
pip install pipdeptree
pipdeptree
输出类似这样:
flask==3.0.0
- jinja2 [required: >=3.1.2, installed: 3.1.3]
- werkzeug [required: >=3.0.0, installed: 3.0.1]
- click [required: >=8.1.3, installed: 8.1.7]
排查依赖冲突的时候,这个工具能救命。
4. 导出可复现的环境
bash
pip freeze --local > requirements.txt
加 --local 会排除掉全局安装的包,只导出当前虚拟环境里装的包。
pip 的替代品?
pip 是官方的、最通用的包管理器,但它不是最快的。后面我们会介绍 uv------一个用 Rust 写的包管理器,速度是 pip 的 10-100 倍。但 pip 的生态地位短期不会动摇,它的基本功你得先掌握。
面试题
1. pip install 和 pip install --user 有什么区别?什么时候用后者?
pip install默认装到系统级或虚拟环境的 site-packages 目录,需要相应权限。pip install --user装到当前用户的~/.local/目录下,不需要管理员权限。当你没有 root/sudo 权限,又不想用虚拟环境时,可以用--user。但不推荐混用,容易导致包冲突。
2. pip freeze > requirements.txt 有什么缺点?怎么改进?
pip freeze会导出环境中所有包(包括间接依赖),导致 requirements.txt 臃肿且不直观。改进方式:手动维护一个 requirements.in 文件只写直接依赖,用pip-tools的pip-compile生成完整的 requirements.txt,用pip-sync安装。
3. 为什么 pip install "requests>=2.28" 中的版本范围要加引号?
因为
>和<在 shell 中是输入输出重定向符号。不加引号的话,shell 会把2.28"当作文件名进行重定向操作,而不是把整个字符串传给 pip。
4. 什么是可编辑安装(pip install -e)?它解决了什么问题?
可编辑安装会在 site-packages 里创建一个链接指向源码目录,而不是复制文件。这样修改源码后不需要重新安装就能生效。主要用于开发 Python 包的时候,避免每次改代码都要重新 install。
上一篇:Python 安装指南
下一篇:虚拟环境:别让包打架