作为Python标准的打包及分发工具,setuptools可以说相当地简单易用。它会随着Python一起安装在你的机器上。你只需写一个简短的setup.py安装文件,就可以将你的Python应用打包。本文就会介绍下如何编写安装文件及如何打包分发
首先,我们安装setuptools可以使用
|
|
tips:如何在Mac中使用目录树
Mac下我们有时需要用到Linux下的tree命令去显示文件树,但是Mac又没有这个命令,于是我们需要安装一个tree包。
首先安装tree包
|
|
使用方法
|
|
最简单的安装文件
新建一个setuptools
的文件夹,他的目录形式如下
|
|
一个最基本的setup.py的文件内容如下
|
|
执行安装
- 创建egg包
现在最简单的安装文件已经有了,现在要执行安装,需要如下的命令
|
|
这个命令会在当前的主目录setuptools_test
中建立一个文件夹dist
,里面包含创建的egg
文件,名字是MyApp-1.0-py2.7.egg
,格式是应用的名字(你要发布的应用的名字,不一定和你的内部包名一致)-版本号-对应的Python版本.egg
。同时,会在文件夹内,建立两个其他文件夹,分别是build
和MyApp.egg-info
,这两个文件夹存放打包的中间结果。
- 创建tar.gz包
|
|
同上例类似,只不过创建的文件类型是tar.gz,文件名为”MyApp-1.0.tar.gz”。
- 安装应用
- 12python setup.py install该命令会将当前的Python应用安装到当前Python环境的”site-packages”目录下,这样其他程序就可以像导入标准库一样导入该应用的代码了。
- 12python setup.py develop如果应用在开发过程中会频繁变更,每次安装还需要先将原来的版本卸掉,很麻烦。使用”develop”开发方式安装的话,应用代码不会真的被拷贝到本地Python环境的”site-packages”目录下,而是在”site-packages”目录里创建一个指向当前应用位置的链接。这样如果当前位置的源码被改动,就会马上反映到”site-packages”里。
安装之后要卸载的话,可以使用pip进行卸载
|
|
此时的目录树如下
|
|
引入非Python文件(不是.py的文件)
上例中,我们只会将”MyApp”包下的源码打包,如果我们还想将其他非Python文件也打包,比如静态文件(JS,CSS,图片),应该怎么做呢?这时我们要在项目目录下添加一个”MANIFEST.in”文件夹。假设我们把所有静态文件都放在”static”子目录下,现在的项目结构如下:
|
|
此时,我们可以在MANIFEST.in
中李处想要在包内引入的目录的路径
|
|
然后在”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也被自动安装了,很方便吧。
自动搜索Python包进行安装
之前我们在setup.py中指定了”packages=[‘MyApp’]”,说明将Python包”MyApp”下的源码打包。如果我们的应用很大,Python包很多怎么办。大家看到这个参数是一个列表,我们当然可以将所有的源码包都列在里面,但肯定很多人觉得这样做很傻。的确,setuptools提供了”find_packages()”方法来自动搜索可以引入的Python包
|
|
这样当前项目内所有的Python包都会自动被搜索到并引入到打好的包内。”find_packages()”方法可以限定你要搜索的路径,比如使用”find_packages(‘src’)”就表明只在”src”子目录下搜索所有的Python包。
Setuptools 的setup()函数的所有参数的介绍
|
|
|
|
|
|
|
|
|
|