1. python包管理工具纵览
distutils 是python标准库的一部分,2000年发布,用于python模块的安装和发布。
setup.py就是利用disutils的工具写成的。
# 包安装
python setup.py install
# 包发布为压缩包
python setup.py sdist
作为distutils的增强版,setuptools项目亮相,该项目以easy_install为对外暴露工具。
setuptools可以对包依赖进行管理,可以自动 下载、构建、安装和管理 python包。
setuptools支持多种方式的包安装
easy_install SQLObject
# 下载一个包,然后安装
easy_install http://xxx.tgz
# 从egg格式文件安装
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的利处,在该篇文章中做了概述:
- Faster installation for pure Python and native C extension packages.
- Avoids arbitrary code execution for installation. (Avoids setup.py)
- Installation of a C extension does not require a compiler on Linux, Windows or macOS.
- Allows better caching for testing and continuous integration.
- Creates .pyc files as part of installation to ensure they match the Python interpreter used.
- More consistent installs across platforms and machines.
通过pip安装wheel格式的包,需要wheel包的支持,故需先安装wheel包
pip install -U wheel
pip install xxx.whl
以numpy 在PyPI上提供的包文件为例,unpack后与其在github上的源码对比,文件组织稍有不同,还待进一步挖掘。