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 解释器
相关推荐
文火冰糖的硅基工坊28 分钟前
[人工智能-大模型-72]:模型层技术 - 模型训练六大步:①数据预处理 - 基本功能与对应的基本组成函数
开发语言·人工智能·python
Python×CATIA工业智造2 小时前
Pycatia二次开发基础代码解析:组件识别、选择反转与链接创建技术解析
python·pycharm
小宁爱Python2 小时前
从零搭建 RAG 智能问答系统 6:Text2SQL 与工作流实现数据库查询
数据库·人工智能·python·django
m0_748241232 小时前
Java注解与反射实现日志与校验
java·开发语言·python
可触的未来,发芽的智生3 小时前
追根索源:换不同的词嵌入(词向量生成方式不同,但词与词关系接近),会出现什么结果?
javascript·人工智能·python·神经网络·自然语言处理
hu_nil3 小时前
LLMOps-第十一周作业
python·vllm
阿Q说代码4 小时前
IPIDEA实现数据采集自动化:高效自动化采集方案
运维·python·自动化·数据采集
大模型真好玩4 小时前
OCR技术简史: 从深度学习到大模型,最强OCR大模型花落谁家
人工智能·python·deepseek
AI量化投资实验室5 小时前
年化591%,回撤仅7%的策略,支持订阅信号|基于AgentScope开发金融多智能体,附python代码
开发语言·python·金融
CaracalTiger5 小时前
告别云端依赖!ComfyUI本地化视频生成实战教程+cpolar实战
python·gpt·开源·aigc·ai编程·1024程序员节·ai-native