从制作python模块包说起
最近用python做一些内部的项目,于是将一些常用的一些工具,接口封装成了通用的python模块包,避免了重复建设,也免除了不必要的Ctrl-C, Ctrl-V。那么如何制作python的模块安装包呢?python模块的打包工具又有哪些呢?
wheel egg 与 tgz
首先我们从python包的格式说起,现在常见的包格式有egg, wheel以及源码安装包tgz,这三种格式的包都可以用setuptools进行制作。
egg格式的包在2004年通过setuptools引入,其本质上是一个包含了项目代码以及元数据(一个名为egg-info的子目录)的zip压缩包,而Wheel格式则是于2012年在PEP 427中引入,一个Wheel格式的包中包含一个名为.dist-info的子目录。对于egg格式的包需要使用easy_install进行安装, wheel以及tgz的都可以使用pip进行安装。 wheel也是官方推荐的包发布格式,相比于Egg与tgz,Wheel带来了许多的新特性,也显得更加友好。
wheel包制作
由于python的包格式很多,我们这里以wheel格式的包制作为例进行介绍怎样制作一个python包。
1. 环境准备
在制作whl包之前,我们需要先安装好pip,wheel。 2.7.9 以及3.4之后的python中默认已经安装了pip。如果没有安装pip,可以在此页面下载 get-pip.py.然后执行下面的命令安装
python get-pip.py
接下来安装wheel
pip install wheel
2. 编写setup.py
这是非常关键的一步,无论你是制作egg格式包还是tgz格式的都需要编写setup.py , 下面以官方文档中的一个例子介绍一下setup.py的格式
#!/usr/bin/env python
from distutils.core import setup
setup(name='Distutils',
version='1.0',
description='Python Distribution Utilities',
author='Greg Ward',
author_email='[email protected]',
url='https://www.python.org/sigs/distutils-sig/',
packages=['distutils', 'distutils.command'], # Distutils需要处理的模块代码
)
常用的参数
packages : 告诉Distutils需要处理的模块代码(含有__init__.py的目录)
package_dir : 告诉Distutils自己的映射规则, 例如当源码都放在 lib目录下时, 我们可以用
package_dir= {'': 'lib'}
这个参数,指定lib为当前包的根目录,假设packages=["foo"], 则实际处理时,Distutils会去处理 lib/foo/目录。
更加详细的代码可以参考这个文档
3. 打包
执行如下命令,会在当前目录下生成whl格式的包。
python setup.py bdist_wheel
上传到pypi
制作好的python发行包只有发布到了互联网上才能被其他人下载使用。首先需要到此目录注册一个帐号 https://pypi.python.org/pypi。
然后安装twine,twine是一个安全的包发布工具
pip3 install twine
然后注册你的python包
twine register dist/mypkg-0.1-py2.py3-none-any.whl
最后一步就是上传你的包到pypi上
twine upload dist/*
至此,大功告成,你已完成了一个python包的制作与发布。