Anaconda——conda和pip管理包的区别


管理包命令示例

  • conda

    • 安装包

      1
      2
      # 从虚拟环境 your_env_name 中安装 packge_name包
      conda install -n your_env_name package_name
    • 删除包

      1
      2
      # 在虚拟环境 your_env_name 中删除 package_name包
      conda remove -n your_env_name package_name
    • 关于conda 命令更多详情参考Anaconda——安装和常用命令

  • pip

    • 安装包

      1
      2
      # 安装包到默认路径
      pip install package_name
    • 卸载包

      1
      2
      # 删除包
      pip uninstall package_name
    • 查看已经安装的包

      1
      2
      3
      4
      # 列出所有包
      pip list
      # 查看指定包的详细信息
      pip show --files package_name
    • 升级包

      1
      pip install --upgrade package_name

conda install 与 pip install 的核心区别

管理范围不同

  • conda install :通用包管理器,能安装 Python 包、C/C++ 库、命令行工具、编译器(如 OpenSSL、CUDA 工具包)
  • pip install :仅限 Python 包,只能安装 PyPI 仓库中的 Python 代码和模块

依赖解析方式不同

  • conda install :安装前严格检查所有依赖,包括底层系统库的版本兼容性,解析全面,安装成功率高
  • pip install :只检查 Python 包级别的依赖,不关心系统底层库(如动态链接库是否缺失),容易因环境不匹配导致安装失败

文件放置机制不同

  • conda install:中央缓存 + 硬链接
    • 中央缓存:包首先被下载并解压到一个统一的缓存目录(如 anaconda3/pkgs
    • 硬链接:当在某个环境(如 myenv)中安装时,conda 会在这个环境的 site-packages 目录中创建指向缓存文件的“硬链接”
      • 这能节省磁盘空间并避免重复下载
  • pip install:直接安装
    • 在当前激活的 Python 环境的 site-packages 目录中直接放入包的实际文件
    • 不使用 conda 的 pkgs 缓存,也不被 conda 管理
  • 总结
    • conda 的安装路径是 <anaconda3>/pkgs/ (缓存)<anaconda3>/envs/<env_name>/lib/pythonX.X/site-packages/ (硬链接)
    • pip 的安装路径是 <anaconda3>/envs/<env_name>/lib/pythonX.X/site-packages/ (实际文件)
  • 注:
    • 如果 pip 指向的是系统 Python,包会安装到系统的 site-packages
    • 若使用 --user 选项,则会安装到用户目录
    • 在当前 conda 虚拟环境下安装时,不管是 conda install 和 pip install 安装都是为当前虚拟环境范围对齐的

元数据记录方式不同

  • conda install :有独立数据库(conda-meta 目录),完整记录每个通过 conda 安装的包及其版本
  • pip install :没有中央数据库,安装记录以 dist-infoegg-info 元数据文件夹的形式直接存放在 site-packages 目录中

彼此感知与可管理性

  • conda install 的包,pip list 会显示吗?
    • 会显示(如果是 Python 包,在 site-packages 里有元数据,pip list 扫描磁盘时能看到)
    • pip 只能“看见”,无法“管理”(不能卸载、不能升级)
      • 执行 pip uninstall 会失败或残留文件
  • conda list 能感知 pip 安装的包
    • conda list 会列出所有用 pipconda 安装的包,且会区分两者的类型展示出来

特别注意:同名包互相覆盖(最危险的问题)

  • 由于安装和管理机制不同,混用会带来以下风险:
    • 依赖冲突
      • 当 conda 后续尝试解决依赖时,可能会因为不了解 pip 安装的包而做出错误判断,导致版本冲突或环境损坏
    • 覆盖与混乱pip 可能会用不同版本的文件覆盖 conda 已安装的包,导致环境状态不一致
    • 卸载不彻底 :用 conda 安装的包,若用 pip 卸载,可能只移除部分文件,留下“孤儿文件”
  • list 动作的效果,conda listpip list 都可以同时展示出两个他们安装的所有包
    • 通过 conda list 是可以同时列出包名和安装来源
    • 通过 pip list 仅列出报名,没有来源

最佳实践(但我不使用)

  • 一些规则(平时我们用的都不对):

    • 1)优先使用 conda :尽可能先用 conda install 安装包
    • 2)**pip 作为补充** :仅当包在 conda 源中不存在时,才使用 pip install
    • 3)统一管理 :通过 conda listpip list 检查包,确保不被混用
    • 4)使用 environment.yml :这是最稳健的做法。在文件中同时声明 conda 和 pip 的依赖,conda 会按顺序处理,确保环境一致性
  • 导入一个新环境的方式

    • 配置文件构造:

      1
      2
      3
      4
      5
      6
      7
      8
      9
      # environment.yml 示例
      name: myenv
      dependencies:
      - python=3.9
      - numpy # conda 安装
      - pip # 必须包含 pip
      - pip:
      - requests # pip 安装
      - click==8.0.0
    • 然后用以下命令创建环境:

      1
      conda env create -f environment.yml