1. python包管理工具纵览

python包管理工具 - 图1 distutils 是python标准库的一部分,2000年发布,用于python模块的安装和发布。
setup.py就是利用disutils的工具写成的。

  1. # 包安装
  2. python setup.py install
  3. # 包发布为压缩包
  4. python setup.py sdist

作为distutils的增强版,setuptools项目亮相,该项目以easy_install为对外暴露工具。
setuptools可以对包依赖进行管理,可以自动 下载、构建、安装和管理 python包。
setuptools支持多种方式的包安装

  1. easy_install SQLObject
  2. # 下载一个包,然后安装
  3. easy_install http://xxx.tgz
  4. # 从egg格式文件安装
  5. easy_install xx/xx/pkt.egg

egg文件之于setuptools,类似于jar包之于java,是一个多文件的压缩聚合。

pip在2008年发布,被视为easy_install的替代,但为了做到向前兼容,仍有大量功能建立在setuptools组件之上。

wheel文件类似于egg,本质上是一个zip包格式,其出现是为了替换egg文件格式。
配合wheel文件的setup.cfg,是用来定义wheel打包时候的相关信息的。

综上, pip + wheel 才是未来的趋势。

那么,下面我们就重点介绍一下 wheel 和 pip

2. Wheel

whl格式文件本质上是压缩包,包含了py文件以及经过编译的pyd文件(可以认为是动态链接库)。
使用wheel的利处,在该篇文章中做了概述:

  1. Faster installation for pure Python and native C extension packages.
  2. Avoids arbitrary code execution for installation. (Avoids setup.py)
  3. Installation of a C extension does not require a compiler on Linux, Windows or macOS.
  4. Allows better caching for testing and continuous integration.
  5. Creates .pyc files as part of installation to ensure they match the Python interpreter used.
  6. More consistent installs across platforms and machines.

通过pip安装wheel格式的包,需要wheel包的支持,故需先安装wheel包

  1. pip install -U wheel
  2. pip install xxx.whl

以numpy 在PyPI上提供的包文件为例,unpack后与其在github上的源码对比,文件组织稍有不同,还待进一步挖掘。

参考:

https://blog.zengrong.net/post/2169.html