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 解释器
相关推荐
Sherry Wangs几秒前
conda安装环境问题
conda
祁思妙想5 分钟前
linux常用命令
开发语言·python
流水落花春去也15 分钟前
用yolov8 训练,最后形成训练好的文件。 并且能在后续项目使用
python
Serendipity_Carl16 分钟前
数据可视化实战之链家
python·数据可视化·数据清洗
小裴(碎碎念版)42 分钟前
文件读写常用操作
开发语言·爬虫·python
TextIn智能文档云平台1 小时前
图片转文字后怎么输入大模型处理
前端·人工智能·python
ujainu1 小时前
Python学习第一天:保留字和标识符
python·学习·标识符·保留字
studytosky1 小时前
深度学习理论与实战:反向传播、参数初始化与优化算法全解析
人工智能·python·深度学习·算法·分类·matplotlib
清水白石0082 小时前
《Python × 数据库:用 SQLAlchemy 解锁高效 ORM 编程的艺术》
开发语言·python·json
星依网络2 小时前
使用LabelImg工具标注数据(游戏辅助脚本开发)
python·游戏引擎·图形渲染·骨骼绑定