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 解释器
相关推荐
用户8356290780511 小时前
使用 Python 管理 PDF 属性和元数据
后端·python
猎嘤一号1 小时前
【2026 最新】Windows 11 右键菜单还原为 Windows 10 经典样式:一条命令、原理、回退与新版说明
windows·python
用户8356290780512 小时前
使用 Python 在 Word 文档中创建自定义图表
后端·python
kyrie_sakura3 小时前
python学习笔记11 -- 进程和线程
笔记·python·学习
Jialu.3 小时前
中文 NLP 模型部署实战:FastAPI 接口 + Streamlit 看板
人工智能·python·自然语言处理·fastapi
Asum1ta4 小时前
K8s 学习环境搭建:Python 与 PyCharm 开发环境配置指南
python·学习·kubernetes
知识汲取者4 小时前
FastAPI 学习教程(写给想学 FastAPI 的 Java 工程师的)
python·学习·fastapi
飞Link4 小时前
动作方法中的分割与过度分割方法全解析(含代码实战与踩坑案例)
人工智能·python·算法·计算机视觉
小鹿的周先生4 小时前
第四章-SpringAI-函数调用&ToolCalling
开发语言·人工智能·python