pip freeze > requirements.txt 会导出所有已安装包(含开发依赖),生产环境应优先用 pipreqs . --force 扫描代码实际 import 的包,再手动补全动态导入项,并通过分层文件(如 base/dev/prod)和版本校验规避部署风险。

pip freeze > requirements.txt 会导出所有包,包括开发依赖
直接用 pip freeze > requirements.txt 最快,但结果里混着 pytest、black、mypy 这类只在本地开发用的包,部署时装上反而可能冲突或拖慢启动。
- 生产环境推荐先用
pip install -e .(项目有setup.py或pyproject.toml)再运行pipreqs . --force,它只扫描代码中import的包 - 如果没写
setup.py,又想排除 dev 依赖,得手动删:先pip list --outdated看哪些真被用了,再对比requirements.txt逐行核对 -
pipreqs不识别动态导入(比如importlib.import_module("xxx")),这类包得自己补进去
pip install -r requirements.txt 安装失败常见原因
报错 Could not find a version that satisfies the requirement xxx 或卡在某个包编译,大概率是环境不一致导致的。
- 检查 Python 版本:不同版本下
numpy、pandas的 wheel 包名不同,requirements.txt里没锁 Python 版本就容易栽坑 - 确认系统架构:macOS ARM64 上生成的
requirements.txt拿去 Linux x86_64 装,torch或tensorflow可能直接找不到匹配 wheel - 避免用
--find-links或私有源未同步:如果某行写了--index-url https://pypi.mycompany.com/simple/,换环境就得配同源,否则跳过或报 404
怎么让 requirements.txt 支持多环境(dev/staging/prod)
硬写多个文件不如用分层方式管理,否则改一个包要同步三处,漏掉就出事。
- 主文件叫
requirements/base.txt,放共用包如requests==2.31.0 - dev 专用写进
requirements/dev.txt,第一行加-r base.txt,再追加pytest>=7.0 - CI/CD 脚本里统一用
pip install -r requirements/prod.txt,而 prod 文件只含-r base.txt,不额外引入 - 别用
pip-tools的pip-compile自动生成——它默认把所有子依赖展开,版本号锁太死,升级时反而难排查冲突
requirements.txt 里写 git 地址时的权限和缓存问题
用 git+ssh://git@github.com:user/repo.git@v1.2.3#subdirectory=src 看似灵活,但 CI 和同事机器上容易因 SSH key 或缓存失效失败。
立即学习“Python免费学习笔记(深入)”;
- SSH 方式要求目标机器已配置对应 key,CI 环境常需提前注入
SSH_PRIVATE_KEY并eval $(ssh-agent),步骤多且易漏 - HTTPS 方式更稳:
git+https://github.com/user/repo.git@v1.2.3,但注意 GitHub 私仓要带 token:git+https://<code>TOKEN@github.com/user/private-repo.git - pip 默认会缓存 git 包,换分支或 tag 后可能仍装旧版,加
--no-deps --force-reinstall --no-cache-dir才保险
flask-login,但代码里还留着 from flask_login import UserMixin,CI 不报错,等到运行时才抛 ImportError。得配合 pre-commit 或 CI 阶段跑一次 python -c "import flask_login" 类似的探活检查。










