将项目打包成模块的想法来自于flask文档教程,这不是在PyCon上和阿明合了照嘛,这不得多看看人家的东西。有兴趣的可以看看文档的项目可安装化部分,作者将flask项目打包成一个包,使其可以再任何地方导入项目并允许,也可以通过
pip install youproject.whl
的方式来安装项目并安装相关的依赖。
可以先瞄一眼官方的打包指南:跳转
1.setuptools简介
setuptools
是distutils
(自行百度)增强版。其扩展了很多功能,能够帮助开发者更好的创建和分发 Python 包。大部分 Python 用户都会使用更先进的 setuptools 模块。
2.包格式
Python 库打包的格式包括 Wheel 和 Egg。Egg 格式是由 setuptools 在 2004 年引入,而 Wheel 格式是由 PEP427 在 2012 年定义。使用 Wheel 和 Egg 安装都不需要重新构建和编译,其在发布之前就应该完成测试和构建。现在普遍用
Wheel
的比较多
3.setup.py文件
from setuptools import find_packages, setup setup( name='flaskr', version='1.0.0', packages=find_packages(), include_package_data=True, zip_safe=False, install_requires=[ 'flask', ], ) 相关参数可以[查看](https://setuptools.readthedocs.io/en/latest/setuptools.html#metadata)
常用参数解释:
3.1. find_packages(where=‘‘,exclude=(),include=(‘*‘,))
上面的setup.py
中使用的find_packages()
,可以方便的为我们添加包不需要手动添加。默认搜索与setup.py
同级目录下各个含有__init__.py
的目录作为要添加的包。
函数的第一个参数用于指定哪个目录下搜索包,参数
exclude
用于指定排除哪些包,include
指定要包含的包。
3.2. include_package_data:
设置为True,自动添加包中受版本控制的数据文件,当需要添加没有被版本控制的文件时,需使用
package_data
。
3.3manifest.in文件(与setup.py同级目录)
文件内容就是需要保护在分发包中的文件
include flaskr/schema.sql graft flaskr/static graft flaskr/templates global-exclude *.pyc
复制所有
static
和templates
文件夹中的文件,schema.sql
文件,但是排除所有字节文件。
3.4. zip_safe
zip_safe
参数决定包是否作为一个zip压缩后的 egg 文件安装,还是作为一个以 .egg 结尾的目录安装。因为有些工具不支持 zip 压缩文件,而且压缩后的包也不方便调试,所以建议将其设为 False,即zip_safe=False
3.5. install_requires
如果你的包依赖于其他包,可以指定
install_requires
参数,为一个列表
install_requires=[ 'requests>=1.0', 'flask>=1.0' ]
默认从pypi下载安装指定依赖包,也可以指定链接下载依赖
dependency_links = [ "http://packages.example.com/snapshots/foo-1.0.tar.gz", "http://example2.com/p/bar-1.0.tar.gz", ]
4.本地测试安装
pip3 install -e .
在当前文件夹中寻找setup.py并在开发模式下安装,安装好后通过
pip list
即可查看本地安装的情况。换个文件夹开始导入你的包进行测试,是否可以正常使用。
5.构建发行文件
先安装好wheel
库
pip3 install wheel
安装好后,执行
bdist_wheel
构建发行文件
python3 setup.py bdist_wheel
会生成
dist
目录,下面有一个flaskr-1.0.0-py3-none-any.whl
类似的由项目名称、版本号和项目安装要求的标记组成。复制该文件到别的计算机,通过pip
命令安装该文件。
6.发布包(简略)
如果要将包发布到PyPI(Python Package Index)官方维护的第三方包仓库,需要先注册pypi的账号,然后创建
~/.pypirc
文件进行一些配置
[distutils] index-servers = pypi [pypi] username:xxx password:xxx
注册项目
python3 setup.py register
成功注册后,构建源码包发布
python3 setup.py sdist upload
最后的最后,别忘了
README.md
和LICENSE
,最好再加上requirements.txt
,可以参考文章开头官网的打包流程