Python一行命令实现自动生成 requirements.txt
作者:林九生
在 Python 项目开发中,我们经常需要生成 requirements.txt 文件,用于:
- 项目部署
- Docker 构建
- 服务器上线
- 团队协作
很多人直接使用:
pip freeze > requirements.txt
但这样会把当前环境的所有包都导出来,包括根本没用到的库,文件又大又乱。
今天给大家介绍一个更优雅、更智能的工具 —— pipreqs。
一、什么是 pipreqs
pipreqs 是一个根据项目源码中 import 自动生成 requirements.txt 的工具。
它只会生成你真正用到的依赖,不会把整个虚拟环境都打包进去。
相比 pip freeze:
| 工具 | 特点 |
|---|---|
| pip freeze | 导出全部环境依赖 |
| pipreqs | 只导出项目实际使用依赖 |
二、安装 pipreqs
pip install pipreqs
说明:
- 直接使用 pip 安装即可
- 支持 Python 3.x
- 建议在虚拟环境中使用
三、一行命令生成 requirements.txt
进入你的项目目录,然后执行:
pipreqs . --force
参数说明:
| 参数 | 作用 |
|---|---|
| . | 当前目录 |
| --force | 强制覆盖已存在的 requirements.txt |
执行后,项目根目录就会自动生成:
requirements.txt
就这么简单!
四、pipreqs 工作原理
pipreqs 会:
- 扫描当前目录所有
.py文件 - 解析
import语句 - 匹配对应 PyPI 包名
- 自动生成 requirements.txt
例如:
import requests import numpy import pandas
生成结果:
numpy==1.26.4 pandas==2.2.1 requests==2.31.0
只包含你真正用到的依赖
五、常用高级用法
1.指定生成路径
pipreqs ./your_project
2.忽略某些目录
pipreqs . --ignore tests
3.使用国内镜像(推荐)
如果你在国内,建议加上:
pipreqs . --pypi-server https://pypi.tuna.tsinghua.edu.cn/simple
这样解析更快。
六、pipreqs vs pip freeze 对比实战
假设你的虚拟环境里安装了 100 个包,但项目只用了 5 个。
使用 pip freeze:
100 个依赖
使用 pipreqs:
5 个依赖
优点:
- 更干净
- 更专业
- 更适合开源项目
- Docker 镜像更小
七、注意事项
- pipreqs 只能识别
import语句 - 动态导入可能识别不到
- 有些包名和 import 名不一致(例如
Pillow)
遇到问题可以手动补充。
八、最佳实践建议
开发阶段:使用 pipreqs 生成干净依赖
部署阶段:再用 pip freeze 做最终锁版本
这样最稳。
九、总结
两行命令解决依赖管理问题:
pip install pipreqs pipreqs . --force
- 自动分析项目
- 只生成真实依赖
- 更专业的 requirements.txt
- 部署更轻量
十、为什么 pipreqs 识别不到数据库依赖
很多同学会遇到一个问题:明明项目用了数据库,结果生成的 requirements.txt 里没有 psycopg2?
例如项目里使用了 PostgreSQL:
import psycopg2
但有时候生成的文件里却没有:
psycopg2
这是为什么呢?
原因分析
1.动态导入或框架间接依赖
如果你没有直接写:
import psycopg2
而是使用了:
- Django
- SQLAlchemy
- Flask + 插件
例如:
DATABASES = {
"ENGINE": "django.db.backends.postgresql"
}
这类字符串配置方式,pipreqs 是识别不到的。
因为它只分析 import 语句。
2.驱动是可选依赖
很多 ORM 框架不会强制安装数据库驱动。
例如:
Django不会自动安装psycopg2SQLAlchemy也不会自动安装数据库驱动
驱动属于:可选运行时依赖
而不是源码级 import 依赖。
解决方案
方案一:手动补充(推荐)
直接在生成后手动添加:
psycopg2-binary==2.9.9
生产环境推荐:
psycopg2
开发环境推荐:
psycopg2-binary
方案二:显式 import(不太优雅)
你可以在某个文件里写:
import psycopg2
这样 pipreqs 就能识别到了。
但这种方式:
- 不够优雅
- 会污染代码结构
不太推荐。
方案三:使用 pipreqs + pip freeze 结合
最佳实践流程:
# 第一步:生成干净依赖 pipreqs . --force # 第二步:确认数据库驱动 pip freeze | grep psycopg2
如果缺失,手动追加即可。
延伸说明:其他常见识别不到的库
除了 psycopg2,以下场景也常见:
| 场景 | 举例 |
|---|---|
| 数据库驱动 | mysqlclient、psycopg2 |
| WSGI 服务器 | gunicorn |
| ASGI 服务器 | uvicorn |
| 任务队列 | celery |
| 生产工具 | redis |
这些通常:
- 运行时依赖
- 部署依赖
- 不一定在源码中 import
十一、深入理解依赖分类
其实依赖可以分为三类:
代码依赖(pipreqs 能识别)
import requests import pandas
运行依赖(pipreqs 识别不到)
数据库驱动
WSGI 服务器
消息队列客户端
系统依赖(pip 管不了)
PostgreSQL 服务
Redis 服务
Nginx
十二、最佳企业实践建议
在实际公司项目中,推荐做法:
开发阶段
pipreqs 生成干净 requirements.txt
测试 / 发布阶段
pip freeze > requirements-prod.txt
或者:
使用 Poetry / Pipenv 管理完整锁版本
这样:
- 开发清爽
- 部署稳定
- CI/CD 更安全
十三、总结
pipreqs 非常适合:
- 开源项目
- 教学项目
- 轻量项目
- 想要干净依赖的人
但记住一句话:pipreqs 只认 import,不认运行环境。
数据库驱动、服务器组件这类依赖,一定要人工确认。
以上就是Python一行命令实现自动生成 requirements.txt的详细内容,更多关于Python生成requirements.txt文件的资料请关注脚本之家其它相关文章!
