同时使用conda和pip时如何锁定Python项目的全版本依赖?
方案1:直接使用conda-lock的内置pip依赖支持
目前新版conda-lock已经原生支持同时解析conda和pip依赖,你只需要调整配置即可:
- 在你的
environment.yml中,把所有pip专属依赖放到dependencies节点下的pip子节点中,示例结构:
name: your-env channels: - conda-forge dependencies: - python=3.10 - pytorch::pytorch - numpy - pip: - some-pip-only-package==1.2.3
- 直接运行
conda-lock lock -f environment.yml,工具会统一解析conda和pip的全量传递依赖,生成的lock文件会同时包含两类依赖的锁定版本,完全避免二者版本冲突 - 安装时直接执行
conda-lock install即可完成全量依赖安装,无需再单独运行pip命令
方案2:调整锁定顺序,用conda环境约束pip-compile解析
如果你暂时不想升级或切换conda-lock的使用方式,可以用顺序锁定的方式避免冲突:
- 先编写仅包含conda依赖的
environment.yml,用conda-lock生成锁定文件并安装到本地/构建环境中 - 从已安装的conda环境中导出所有已存在的包版本作为约束文件:
pip freeze > constraints.txt - 运行
pip-compile时增加约束参数:pip-compile requirements.in --constraint constraints.txt,此时pip-compile会完全遵循conda已安装的包版本生成锁定清单,不会生成冲突的版本号 - 最终
pip install -r requirements.txt时不会再出现覆盖、重复安装conda依赖的问题
额外优化建议
- 优先把依赖放到conda源中安装,仅当conda源确实没有对应包时再放到pip依赖中,尽可能减少交叉依赖的冲突概率
- Docker构建场景下可以把conda依赖层和pip依赖层分开,只要锁定文件没有变化,两层都可以复用缓存
内容的提问来源于stack exchange,提问作者jli
相关产品推荐
相关产品推荐

