pip freeze > requirements.txt 导出的环境在新机器上装不完,因其仅记录已安装包的精确版本,不区分直接/间接依赖,且忽略系统自带、conda或editable安装的包,导致缺失pkg_resources等关键组件或torch版本冲突。

pip freeze > requirements.txt 为什么导出的环境在新机器上装不完
因为 pip freeze 只记录当前已安装包的精确版本,不区分「直接依赖」和「间接依赖」,更不管哪些包是系统自带、conda 安装、或通过 --editable 装的。常见现象是:旧环境能跑,新环境 pip install -r requirements.txt 后 import 报错,比如缺 pkg_resources、setuptools,或者 torch 和 torchvision 版本冲突。
- 只在虚拟环境中执行
pip freeze > requirements.txt,避免混入全局包 - 导出前先运行
pip install --upgrade pip setuptools wheel,减少因打包工具差异导致的安装失败 - 如果用了 conda,别用
pip freeze—— 改用conda env export > environment.yml,它会保留 channel 和构建信息 - 检查生成的
requirements.txt,手动删掉像pkg-resources==0.0.0这种伪包(常见于 Ubuntu 系统 pip)
requirements.txt 安装时卡住或编译失败怎么办
本质是二进制兼容性问题:旧机器有编译器、CUDA、OpenSSL 头文件,新机器没有;或者包指定了平台特定的 manylinux 标签,但新系统 glibc 版本太低。
- 优先加
--only-binary=all:运行pip install --only-binary=all -r requirements.txt,强制跳过源码编译 - 遇到
torch类包,别信requirements.txt里的版本号——去官网查对应 CUDA 版本的安装命令,单独重装,例如:pip3 install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118 - 若新机器是 Apple Silicon(M1/M2),注意有些包还没提供 arm64 wheel,得加
--no-binary指定个别包源码编译,比如:pip install --no-binary=xgboost xgboost - 临时换镜像源提速:
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple/ -r requirements.txt
怎么保留 Python 版本和虚拟环境结构一起迁移
requirements.txt 不存 Python 版本,也不存 virtualenv 创建参数(比如是否继承系统 site-packages)。靠它无法还原一模一样的环境。
- 手动记下 Python 版本:
python --version,新机器必须装同版本(如3.9.18,不能只装3.9) - 用
virtualenv --python=3.9.18 myenv显式指定解释器路径,避免默认调用系统 python3 - 如果原环境用了
venv,可把整个myenv/文件夹打包带走(Windows 注意去掉Scripts/activate.bat的绝对路径),但仅限同系统同架构(Linux → Linux,不要跨 macOS/Windows) - 更稳的方式是用
pyenv+pipenv或poetry:它们会在项目根目录写明.python-version和锁文件(Pipfile.lock/poetry.lock),还原时自动拉对 Python 和依赖树
conda 环境迁移比 pip 更可靠吗
是,但只在 conda 生态内成立。它能固化 Python 版本、编译器、甚至 glibc 小版本,适合科学计算场景;但对纯 Python 包或需要调用系统库的项目,反而可能因过度锁定导致新机器起不来。
立即学习“Python免费学习笔记(深入)”;
- 导出用
conda env export --from-history > environment.yml:加--from-history只导你手动conda install的包,不导依赖自动带进来的(避免锁死次要版本) - 导入前先删掉
environment.yml里prefix:那行,否则 conda 会硬塞到旧路径 - 如果新机器没装 conda,别折腾——直接用
miniforge(轻量版,支持 arm64)替代anaconda - 混合使用 conda 和 pip 时,务必先
conda install,再pip install,否则 pip 可能覆盖 conda 管理的包,导致conda list和实际不一致
真正麻烦的不是导出导入动作本身,而是环境隐含的假设:Python 解释器 ABI 兼容性、系统 C 库版本、GPU 驱动存在与否、甚至 shell 的 PATH 顺序。这些都不会出现在任何文本文件里,只能靠人去对齐。










