Python打包分发工具setuptools简介(转)

做为Python标准的打包及分发工具,setuptools能够说至关地简单易用。它会随着Python一块儿安装在你的机器上。你只需写一个简短的setup.py安装文件,就能够将你的Python应用打包。本文就会介绍下如何编写安装文件及如何打包分发。html

首先,若是你须要另外安装setuptools,你可使用下面的命令:python

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

第一个安装文件

接下来让咱们编写安装文件,假设咱们的项目名为setup-demo,包名为myapp,目录结构以下:git

setup-demo/
  ├ setup.py         # 安装文件
  └ myapp/           # 源代码
      ├ __init__.py    
      ...

一个最基本的setup.py文件以下:web

执行安装文件

有了上面的setup.py文件,咱们就能够打各类包,也能够将应用安装在本地Python环境中。app

    1. 建立egg包
$ python setup.py bdist_egg

该命令会在当前目录下的”dist”目录内建立一个egg文件,名为”MyApp-1.0-py2.7.egg”。文件名格式就是”应用名-版本号-Python版本.egg”,我本地Python版本是2.7。同时你会注意到,当前目录多了”build”和”MyApp.egg-info”子目录来存放打包的中间结果。eclipse

    1. 建立tar.gz包
$ python setup.py sdist --formats=gztar

同上例相似,只不过建立的文件类型是tar.gz,文件名为”MyApp-1.0.tar.gz”。工具

    1. 安装应用
$ python setup.py install

该命令会将当前的Python应用安装到当前Python环境的”site-packages”目录下,这样其余程序就能够像导入标准库同样导入该应用的代码了。ui

    1. 开发方式安装
$ python setup.py develop

若是应用在开发过程当中会频繁变动,每次安装还须要先将原来的版本卸掉,很麻烦。使用”develop”开发方式安装的话,应用代码不会真的被拷贝到本地Python环境的”site-packages”目录下,而是在”site-packages”目录里建立一个指向当前应用位置的连接。这样若是当前位置的源码被改动,就会立刻反映到”site-packages”里。url

引入非Python文件

上例中,咱们只会将”myapp”包下的源码打包,若是咱们还想将其余非Python文件也打包,好比静态文件(JS,CSS,图片),应该怎么作呢?这时咱们要在项目目录下添加一个”MANIFEST.in”文件夹。假设咱们把全部静态文件都放在”static”子目录下,如今的项目结构以下:spa

setup-demo/
  ├ setup.py         # 安装文件
  ├ MANIFEST.in      # 清单文件
  └ myapp/           # 源代码
      ├ static/      # 静态文件目录    
      ├ __init__.py    
      ...

咱们在清单文件”MANIFEST.in”中,列出想要在包内引入的目录路径:

“recursive-include”代表包含子目录。别急,还有一件事要作,就是在”setup.py”中将” include_package_data”参数设为True:

以后再次打包或者安装,”myapp/static”目录下的全部文件都会被包含在内。若是你想排除一部分文件,能够在setup.py中使用”exclude_package_date”参数,好比:

上面的代码会将全部”.gitignore”文件排除在包外。若是上述”exclude_package_date”对象属性不为空,好比”{‘myapp’:[‘.gitignore’]}”,就代表只排除”myapp”包下的全部”.gitignore”文件。

自动安装依赖

咱们的应用会依赖于第三方的Python包,虽然能够在说明文件中要求用户提早安装依赖包,但毕竟很麻烦,用户还有可能装错版本。其实咱们能够在setup.py文件中指定依赖包,而后在使用setuptools安装应用时,依赖包的相应版本就会被自动安装。让咱们来修改上例中的setup.py文件,加入”install_requires”参数:

上面的代码中,咱们声明了应用依赖Flask 0.10及以上版本,和Flask-SQLAlchemy 1.5及以上、2.1及如下版本。setuptools会先检查本地有没有符合要求的依赖包,若是没有的话,就会从PyPI中得到一个符合条件的最新的包安装到本地。

你们能够执行下试试,你会发现不但Flask 0.10.1(当前最新版本)被自动安装了,连Flask的依赖包Jinja2和Werkzeug也被自动安装了,很方便吧。

若是应用依赖的包没法从PyPI中获取怎么办,咱们须要指定其下载路径:

路径应指向一个egg包或tar.gz包,也能够是个包含下载地址(一个egg包或tar.gz包)的页面。我的建议直接指向文件。

自动搜索Python包

以前咱们在setup.py中指定了”packages=[‘myapp’]”,说明将Python包”myapp”下的源码打包。若是咱们的应用很大,Python包不少怎么办。你们看到这个参数是一个列表,咱们固然能够将全部的源码包都列在里面,但确定不少人以为这样作很傻。的确,setuptools提供了”find_packages()”方法来自动搜索能够引入的Python包:

这样当前项目内全部的Python包都会自动被搜索到并引入到打好的包内。”find_packages()”方法能够限定你要搜索的路径,好比使用”find_packages(‘src’)”就代表只在”src”子目录下搜索全部的Python包。

补充

    • zip_safe参数

决定应用是否做为一个zip压缩后的egg文件安装在当前Python环境中,仍是做为一个以.egg结尾的目录安装在当前环境中。由于有些工具不支持zip压缩文件,并且压缩后的包也不方便调试,因此建议将其设为False:”zip_safe=False”。

    • 描述信息

部分参数提供了更多当前应用的细节信息,对打包安装并没有任何影响,好比:

更多内容请参阅setuptools的官方文档

 

转自:http://www.bjhee.com/setuptools.html

相关文章
相关标签/搜索