从制作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包的制作与发布。