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 解释器
相关推荐
深盾安全2 分钟前
uv,下一代Python包管理工具
python
山烛31 分钟前
OpenCV 图像处理基础操作指南(二)
人工智能·python·opencv·计算机视觉
跟橙姐学代码1 小时前
学Python,先把这“三板斧”练到炉火纯青!(零基础也能看懂)
前端·python
让心淡泊1442 小时前
DAY 50 预训练模型+CBAM模块
python
BYSJMG2 小时前
计算机大数据毕业设计推荐:基于Spark的气候疾病传播可视化分析系统【Hadoop、python、spark】
大数据·hadoop·python·信息可视化·spark·django·课程设计
抠头专注python环境配置3 小时前
OCR库pytesseract安装保姆级教程
python·ocr·conda
山烛3 小时前
矿物分类系统开发笔记(二):模型训练[删除空缺行]
人工智能·笔记·python·机器学习·分类·数据挖掘
大得3694 小时前
django生成迁移文件,执行生成到数据库
后端·python·django
大志说编程4 小时前
LangChain框架入门17: 手把手教你创建LLM工具
python·langchain·ai编程
R-G-B4 小时前
【P38 6】OpenCV Python——图片的运算(算术运算、逻辑运算)加法add、subtract减法、乘法multiply、除法divide
人工智能·python·opencv·图片的运算·图片加法add·图片subtract减法·图片乘法multiply