0.什么是setuptools

setuptools是Python distutils增强版的集合,它可以帮助我们更简单的创建和分发Python包,尤其是拥有依赖关系的。用户在使用setuptools创建的包时,并不需要已安装setuptools,只要一个启动模块即可。

功能亮点:

  • 利用EasyInstall自动查找、下载、安装、升级依赖包
  • 创建Python Eggs
  • 包含包目录内的数据文件
  • 自动包含包目录内的所有的包,而不用在setup.py中列举
  • 自动包含包内和发布有关的所有相关文件,而不用创建一个MANIFEST.in文件
  • 自动生成经过包装的脚本或Windows执行文件
  • 支持Pyrex,即在可以setup.py中列出.pyx文件,而最终用户无须安装Pyrex
  • 支持上传到PyPI
  • 可以部署开发模式,使项目在sys.path中
  • 用新命令或setup()参数扩展distutils,为多个项目发布/重用扩展
  • 在项目setup()中简单声明entry points,创建可以自动发现扩展的应用和框架

总之,setuptools就是比distutils好用的多,基本满足大型项目的安装和发布

1.安装setuptools

1) 最简单安装,假定在ubuntu下

sudo apt-get install python-setuptools

2) 启动脚本安装

wget http://peak.telecommunity.com/dist/ez_setup.py
sudo python ez_setup.py

2.创建一个简单的包

有了setuptools后,创建一个包基本上是无脑操作

cd /tmp 
mkdir demo
cd demo

在demo中创建一个setup.py文件,写入

 

[python] view plain copy
1. from setuptools import setup, find_packages  
2.   
3. setup(  
4. "demo",  
5. "0.1",  
6.     packages = find_packages(),  
7.     )

 

执行python setup.py bdist_egg即可打包一个test的包了。

 

 

demo
|-- build
|   `-- bdist.linux-x86_64
|-- demo.egg-info
|   |-- dependency_links.txt
|   |-- PKG-INFO
|   |-- SOURCES.txt
|   `-- top_level.txt
|-- dist
|   `-- demo-0.1-py2.7.egg
`-- setup.py

在dist中生成的是egg包

file dist/demo-0.1-py2.7.egg
dist/demo-0.1-py2.7.egg: Zip archive data, at least v2.0 to extract

看一下生成的.egg文件,是个zip包,解开看看先

unzip -l dist/demo-0.1-py2.7.egg

Archive:  dist/demo-0.1-py2.7.egg
  Length      Date    Time    Name
---------  ---------- -----   ----
        1  2013-06-07 22:03   EGG-INFO/dependency_links.txt
        1  2013-06-07 22:03   EGG-INFO/zip-safe
      120  2013-06-07 22:03   EGG-INFO/SOURCES.txt
        1  2013-06-07 22:03   EGG-INFO/top_level.txt
      176  2013-06-07 22:03   EGG-INFO/PKG-INFO
---------                     -------
      299                     5 files

我们可以看到,里面是一系列自动生成的文件。现在可以介绍一下刚刚setup()中的参数了

  • name 包名
  • version 版本号
  • packages 所包含的其他包

要想发布到PyPI中,需要增加别的参数,这个可以参考官方文档中的例子了。

3.给包增加内容

上面生成的egg中没有实质的内容,显然谁也用不了,现在我们稍微调色一下,增加一点内容。

在demo中执行mkdir demo,再创建一个目录,在这个demo目录中创建一个__init__.py的文件,表示这个目录是一个包,然后写入:

 

[python] view plain copy
1. #!/usr/bin/env python
2.   
3. def test():  
4.     print 'Hello World!'
5.   
6. if __name__ == '__main__':  
7.     test()

 

 

现在的主目录结构为下:

 

 

demo
|-- demo
|   `-- __init__.py
`-- setup.py

再次执行python setup.py bdist_egg后,再看egg包

Archive:  dist/demo-0.1-py2.7.egg
  Length      Date    Time    Name
---------  ---------- -----   ----
        1  2013-06-07 22:23   EGG-INFO/dependency_links.txt
        1  2013-06-07 22:23   EGG-INFO/zip-safe
      137  2013-06-07 22:23   EGG-INFO/SOURCES.txt
        5  2013-06-07 22:23   EGG-INFO/top_level.txt
      176  2013-06-07 22:23   EGG-INFO/PKG-INFO
       95  2013-06-07 22:21   demo/__init__.py
      338  2013-06-07 22:23   demo/__init__.pyc
---------                     -------
      753                     7 files

这回包内多了demo目录,显然已经有了我们自己的东西了,安装体验一下。

python setup.py install

这个命令会讲我们创建的egg安装到python的dist-packages目录下,我这里的位置在

tree /usr/local/lib/python2.7/dist-packages/demo-0.1-py2.7.egg

查看一下它的结构:

/usr/local/lib/python2.7/dist-packages/demo-0.1-py2.7.egg
|-- demo
|   |-- __init__.py
|   `-- __init__.pyc
`-- EGG-INFO
    |-- dependency_links.txt
    |-- PKG-INFO
    |-- SOURCES.txt
    |-- top_level.txt
    `-- zip-safe

打开python终端或者ipython都行,直接导入我们的包

>>> import demo
>>> demo.test()
hello world!
>>>

好了,执行成功!