conda 依赖固定和 pip 依赖使用的区别

前言

下面是一个常见的 conda.yaml 的依赖的描述文件

复制代码
dependencies:
- python=3.7.0
- numpy=1.21.0
- ca-certificates=2024.11.26
- pip
- pip:
  - mlflow==1.18.0
  - cloudpickle==0.5.3
  - protobuf==3.19.4
  - grpcio==1.23.1
name: mlflow-env

通过下面命令,可以创建一个独立的 env 出来:

复制代码
conda env create -n test -f conda.yaml

那么问题来了 dependencies 依赖和 pip 的依赖区别是啥,它们的使用场景是什么

dependencies vs pip

dependencies下面的依赖,是 conda 管理的,而 pip 下面的依赖是 pip 管理的

使用场景
最佳实践
  • 优先使用 conda 的 dependencies, 因为 Conda 会更好地处理依赖关系和跨平台兼容性
  • 必要时使用 pip,如果 Conda 渠道中没有你需要的包,或者你需要特定版本的包,再使用 pip
  • 混合使用:在实际项目中,通常会混合使用 Conda 和 Pip。例如,使用 Conda 安装 Python 解释器和系统级依赖,使用 Pip 安装 PyPI 独有的包
  • 注意事项:
    • 依赖冲突:Conda 和 Pip 的依赖解析机制不同,混合使用时可能会导致依赖冲突。建议先通过 Conda 安装尽可能多的依赖,再使用 Pip 安装剩余的包。
    • 环境隔离:始终在 Conda 环境中使用 Pip,而不是在系统 Python 中使用 Pip,以避免污染系统环境
    • 渠道优先级 :如果需要使用 conda-forge 等第三方渠道,可以在 conda.yaml 中指定
环境隔离

conda.yaml 文件中使用 pip 安装的依赖是 当前 Conda 环境独享的,而不是操作系统全局的。这是因为 Conda 环境是独立的、隔离的 Python 环境,所有的依赖(无论是通过 Conda 还是 Pip 安装)都会被限制在该环境中

验证方法:

1,新建一个环境 test

2,激活环境:conda activate test

3,查看依赖:pip list

4,退出 Conda 环境:conda deactivate ,然后再次查看依赖:pip list

复制代码
# 激活环境
conda activate test

# 查看 pip 位置
which pip  # 会显示当前环境的 pip 路径

# 查看包安装位置
pip list -v  # 会显示包的安装路径
conda 依赖固定

因为 conda 管理 python 解释器,而特定的 python 版本有可能会依赖某个组件库的最新版本:比如 ca-certificates 这个依赖,是 python 解释器的使用的,默认就下载最新的,但如果我们的私服没有这个库,就会引发异常,这个时候最佳实践就是固定该库的版本,有两种方式:

修改 yaml 指定
复制代码
dependencies:
- python=3.7.0
- ca-certificates=2024.11.26 # 指定系统库依赖
- pip
- pip:
  - mlflow==1.18.0
通过 conda pinned_packages 配置固定

pinned_packages 是一个 Conda 配置文件中的选项,用于指定在当前环境中 必须保持固定版本 的包。这些包会被"锁定",即使你运行 conda update --all 或安装新包,Conda 也不会自动更新这些包的版本, 从而可以确保

环境一致性

复制代码
# 添加固定包
conda config --add pinned_packages ca-certificates=2024.11.26

# 查看当前固定包
conda config --show pinned_packages

# 删除固定包
conda config --remove pinned_packages 'package_name=version'


# conda config --add pinned_packages 默认是在当前激活的环境中生效。如果你想在全局范围内固定包,可以使用 --system 或 --env 选项。
为什么不是全局的?
  • Conda 环境的设计目标之一就是提供隔离的环境,避免不同项目之间的依赖冲突。
  • 如果你在 Conda 环境中使用 pip 安装包,pip 会默认绑定到当前 Conda 环境的 Python 解释器,而不是系统全局的 Python 解释器
相关推荐
阿正的梦工坊1 小时前
深入理解 PyTorch 中的 unsqueeze 操作
人工智能·pytorch·python
FreakStudio1 小时前
硬件版【Cursor】?aily blockly IDE尝鲜封神,实战硬伤尽显
python·单片机·嵌入式·大学生·面向对象·并行计算·电子diy·电子计算机
测试员周周3 小时前
【Appium 系列】第06节-页面对象实现 — LoginPage 实战
开发语言·前端·人工智能·python·功能测试·appium·测试用例
2301_783848654 小时前
优化文本分类中堆叠模型的网格搜索性能:避免训练卡顿的实战指南
jvm·数据库·python
CLX05054 小时前
如何安装Oracle 12c Cloud Control_OMS服务端组件与Agent部署
jvm·数据库·python
老纪5 小时前
SQL中如何查找特定的空值行:WHERE IS NULL深度解析
jvm·数据库·python
噜噜噜阿鲁~5 小时前
python学习笔记 | 10.0、面向对象编程
笔记·python·学习
weixin199701080165 小时前
[特殊字符] RESTful API 接口规范详解:构建高效、可扩展的 Web 服务(附 Python 源码)
前端·python·restful
2301_781571426 小时前
mysql数据库响应缓慢如何排查_使用EXPLAIN分析执行计划
jvm·数据库·python
彳亍1016 小时前
实现倒计时数字在到达1后自动隐藏(2为最后可见数字),同时继续运行至-1再终止
jvm·数据库·python