pip freeze > requirements.txt 导出全量环境包,含冗余项;pipreqs 仅基于 import 语句提取真实依赖,更精准但不识别动态导入、隐式依赖及 setup.py 中的声明。

直接用 pip freeze > requirements.txt 最快,但会导出整个环境所有包,包括 conda 自带的、非项目依赖的冗余项;真要精准导出项目实际用到的包,得换 pipreqs。
pip freeze 导出的是“全量快照”,不是“项目依赖”
它读取当前 Python 环境里所有已安装的包(含 conda 安装的底层库如 mkl、blas、ca-certificates),生成的 requirements.txt 通常包含几十甚至上百行,其中大量是环境基础设施,跟你的代码无关。
- 适合快速备份或迁移整个环境(配合
pip install -r requirements.txt) - 不适合分享给他人复现项目——别人装完可能报错,因为某些包只在 conda 渠道提供,
pip找不到 - 若环境混用了
conda install和pip install,pip freeze会漏掉 conda-only 包的版本约束(比如显示numpy却不带构建号=1.21.5=py39hdbf815f_0)
pipreqs 只扫描 import,但默认会因编码报错
它递归解析项目下所有 .py 文件里的 import 和 from ... import,只列出真正被引用的包,干净利落。但 Windows 下中文路径或含中文注释的文件极易触发 UnicodeDecodeError: 'gbk' codec can't decode byte...。
- 解决方法:找到
pipreqs.py文件(路径类似C:\Anaconda3\Lib\site-packages\pipreqs\pipreqs.py),定位第 75 行左右的f.read(),改成f.read(encoding='utf-8') - 运行前确保在项目根目录,且没进错子目录(否则扫不到主入口文件)
- 支持忽略目录:
pipreqs ./ --ignore=tests,migrations,venv - 不识别
setup.py或pyproject.toml里的依赖,纯靠静态 import 分析
conda env export 更适合跨平台完整重建
用 conda env export > environment.yml 导出的是 conda 原生格式,包含 Python 版本、channel 信息、构建号(如 numpy=1.21.5=py39hdbf815f_0),在另一台装了 conda 的机器上执行 conda env create -f environment.yml 能最大程度还原环境。
- 缺点:生成的
environment.yml文件巨大(常超千行),含平台相关字段(如platform: win-64),不能直接用在 Linux/macOS - 若只想导出 pip 安装的包(排除 conda-only 库),加
--from-history参数(但仅对用conda install --file或conda install显式安装过的有效) - 导出时加
--no-builds可去掉构建号,提升跨平台兼容性,但可能引发版本歧义
真正关键的取舍点不在“怎么导”,而在“导给谁用”:给别人跑你的脚本?选 pipreqs;自己在多台机器同步开发环境?用 conda env export;临时备份怕丢包?pip freeze 最省事。别忘了,requirements.txt 里一旦出现 conda-forge 或构建号字段,pip install 就会直接失败——这点最容易被忽略。











