Conda: Introduction

 20th August 2020 at 2:19pm

Conda 是一个跨平台的系统级包管理器。这个 幻灯片 有一些基础介绍。

Anaconda 公司维护了一批预编译好的包。这些包不止有带 C 扩展的 Python 库(比如 mysql-python),也有一些 C 库本身(如 libpng)。Conda 可以生成一套类似 virtualenv 的环境,包含 Python 本身、C 库以及 Python 库,以实现方便的部署和环境隔离。

Anaconda 公司维护了几个产品:

  • Conda:包管理器本身,类似 yum / apt-get
  • miniconda:一个 Python 发行版,包含 Python 本体和 Conda,以及非常基础的 Python 库,如 setuptoolspip
  • Anaconda:一个 Python 发行版,等于 miniconda 基础上再预装一两百个流行的 Python 库,主要针对 Data Science 场景
  • Anaconda 仓库:官方维护的 1000+ 个库,包含 C 库和 Python 库
  • Anaconda Cloud:一个云服务,可以托管企业自己打包的库(用 conda-build 打包),并提供部署的解决方案

快速链接:

特性

这里 抄的:

  • Excellent support for “system-level” environments (like having mini VMs but much lighter weight than docker.io)
  • Minimizes code-copies (uses hard/soft links if possible)
  • Dependency solver using fast satisfiability solver (SAT solver)
  • Simple format binary tar-ball + meta-data
  • Meta-data allows static analysis of dependencies
  • Easy to create multiple “channels” which are repositories for binary packages
  • User installable (no root privileges needed)
  • Can still use tools like pip — conda fills in where they fail.

具体实现

没有找到太详细的资源讲述 conda 的工作原理,但是从安装好的文件中可以观察到一些行为。

Conda 安装时会将很基础的系统库软链一份到 <conda_dir>/x86_64-conda_cos6-linux-gnu/sysroot/lib/,比如 lib/libatomic.so.1.2.0

<conda_dir>/lib/pkgconfig/ 中,各种路径参数会被设置成安装的路径,比如 <conda_dir>/lib/pkgconfig/python-3.6.pc

# See: man pkg-config
prefix=/home/onlyice/miniconda3
exec_prefix=${prefix}
libdir=${exec_prefix}/lib
includedir=${prefix}/include

Name: Python
Description: Python library
Requires:
Version: 3.6
Libs.private: -lpthread -ldl  -lutil -lrt
Libs: -L${libdir} -lpython3.6m
Cflags: -I${includedir}/python3.6m

lib 目录下用的库,大多是 hard link pkg 目录下的库的。可以通过观察 inode 得知。Anaconda 的工程师在这个 issue 中提到为什么要用 hard link 而不是用 soft link。

Conda 创建出来的新 env,跟 virtualenv 不太一样,会「拷贝」一份完整的 Python 和各种包,包括 mysql 那些。这个 env 会有 100M 以上大小。「拷贝」这个词不准确,conda 会优先使用 hard link 和 soft link,实在不行才会拷贝。

预编译的包所使用的编译器

Anaconda 5 及以上,或者 conda 4.3.26 及以上版本,基线的编译器全面换成了 CentOS 6 / glibc 2.12(来源)。

同时 Anaconda 5 在编译器上,用了自己的工具集替换了系统默认工具集,参考这篇 文章