02 pip 与包管理基础——你的第一个包管理工具

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-syncpip 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 installpip 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-toolspip-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 安装指南
下一篇:虚拟环境:别让包打架

相关推荐
xing-xing7 小时前
PIP工具学习总结
python·pip
消失的旧时光-194312 小时前
第四篇:Point-In-Polygon 是什么?——机器人电子围栏核心算法
机器人·pip·rtk
开发者联盟league2 天前
pip install出现报错ERROR: Cannot set --home and --prefix together
开发语言·python·pip
开发者联盟league5 天前
linux普通用户使用pip安装模块
linux·python·pip
九成宫5 天前
WSL2 网络优化配置:提升Git克隆与包下载速度
windows·笔记·代理模式·pip·wsl
m0_617493949 天前
pip安装zxing-cpp报错“returned non-zero exit status 1”的完美解决方案
pip
咕噜咕噜啦啦10 天前
RTX5090配置DGL
pytorch·python·conda·pip
马优晨12 天前
Pip 和 Conda 是什么关系?
conda·pip·pip 和 conda 关系·conda和pip的关系·pip和conda是什么
金玉满堂@bj13 天前
# Groovy Pipeline 详解
pip