Python打包之setuptools

参考连接1html

参考连接2python

参考连接3git

1、setuptools介绍

Setuptools是Python Distutils的增强版,使开发者构建和发布Python包更加容易,特别是当包依赖于其余包时。用setuptools构建和发布的包与用Distutils发布的包是相似的。包的使用者无需安装setuptools就可使用该包。若是用户是从源码包开始构建,而且没有安装过setuptools的话,则只要在你的setup脚本中包含一个bootstrap模块(ez_setup),用户构建时就会自动下载并安装setuptools了。bootstrap

功能亮点:app

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

 

2、简单的例子

python中安装包的方式有不少种:框架

  1. 源码包:python setup.py install
  2. 在线安装:pip install 包名 / easy_install 包名

pip install的东西从哪里来的?ide

从PyPI (Python Package Index)来的,官网是:  https://pypi.python.org/pypisvg

执行pip install terminaltranslator命令的时候,它就会去从官方网站搜terminaltranslator,搜到了就下载压缩包并解压安装,若是没有搜索到就会报错。

函数

一、源码包安装

源码包安装就是你在本地编写好了一个模块,本身安装在本地使用,别人(即便是你本身)都不能 pip install xxx 下载你的模块工具

1.准备工做

# 1.首先建立咱们须要的目录结构和文件(自行建立)
# 当前测试的目录是: /tmp/demo
`-- demo |-- helloapp | |-- hello.py | `-- __init__.py |-- __init__.py |-- myapp | |-- __init__.py | `-- myapp.py `-- setup.py # 2.编辑 setup.py from setuptools import setup, find_packages setup( name="demo", version="1.0", author="zbj", author_email="22@qq.com", packages=find_packages(), ) # 3.编辑 hello.py def hello_func(): print("HelloWorld") # 4.编辑 myapp.py def myapp_func(): print("嘿嘿嘿")

 

2.源码安装

# 进入setup.py所在的那层目录
cd /tmp/demo # 检查setup.py 是否有错误(warning不是错误)
python setup.py check # 安装
python setup.py install

 

3.结果

打包以后多出两个文件夹,分别是demo.egg-info和dist。demo.egg-info是必要的安装信息,

而dist中的压缩包就是安装包,此时默认的egg包,egg包就是zip包,若是须要使用egg包,name将egg后缀改为zip解压便可

 

4.测试

测试的时候须要注意导包路径和当前所在路径
目前所在路径是: /tmp/demo
直接进入python解释器: python3(我本身安装的python3版本)

 

 

 

5.setuptools更多参数用法 

https://setuptools.readthedocs.io/en/latest/setuptools.html

 

二、打包上传到pypi

官网链接

2-一、配置文件和打包

1.建立文件的目录结构

hello/
|-- hello |   |-- hello.py |   `-- __init__.py |-- LICENSE |-- README.md `-- setup.py

 

2. setup.py

from setuptools import setup, find_packages setup( name="hello", version='1.0', description="Test Hello", url="None", author="zbj", author_email="22@qq.com", license="MIT", packages=find_packages() )

 

3. LICENSE

LICENSE表明许可证

官网

Copyright (c) 2018 The Python Packaging Authority Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

 

4. setuptools 和wheel

首先须要保证你有最新版的setuptools 和wheel

python -m pip install --user --upgrade setuptools wheel

Tip:若是出现问题了能够查看官网的解决方案:https://packaging.python.org/tutorials/installing-packages/

 

5. 打包模块

# 进入到setup.py同级的目录下
python setup.py sdist bdist_wheel

打包以后多出两个文件夹,分别是hello.egg-info和dist。hello.egg-info是必要的安装信息,而dist中的压缩包就是安装包

dist中包含两个文件:

dist/
|-- hello-1.0-py3-none-any.whl `-- hello-1.0.tar.gz

 

6.打包方式介绍

有了上面的 setup.py 文件,咱们就能够打出各类安装包,主要分为两类:sdist 和 bdist。

Source distribution

使用 sdist 能够打包成 source distribution,支持的压缩格式有:

Format Description Notes
zip zip file (.zip) Windows 默认
gztar gzip’ed tar file (.tar.gz) Unix 默认
bztar bzip2’ed tar file (.tar.bz2)  
xztar xz’ed tar file (.tar.xz)  
ztar compressed tar file (.tar.Z)  
tar tar file (.tar)  

使用方式为:

$ python setup.py sdist --formats=gztar,zip

如今目录下多出 dist 和 *.egg-info 目录,dist 内保存了咱们打好的包,上面命令使用 --formats 指定了打出 .tar.gz.zip 包,若是不指定则如上表根据具体平台默认格式打包。

包的名称为 setup.py 中定义的 name, version以及指定的包格式,格式如:firstApp-0.0.1.tar.gz。

Built distribution

使用 bdist 能够打出 built distribution,和源码包相比,因为预先构建好,因此安装更快:

Format Description Notes
gztar gzipped tar file (.tar.gz) Unix 默认
bztar bzipped tar file (.tar.bz2)  
xztar xzipped tar file (.tar.xz)  
ztar compressed tar file (.tar.Z)  
tar tar file (.tar)  
zip zip file (.zip) Windows 默认
rpm RPM  
pkgtool Solaris pkgtool  
sdux HP-UX swinstall  
wininst self-extracting ZIP file for Windows  
msi Microsoft Installer.  

使用上,和 sdist 同样,可使用 --formats 指定包格式。如:

$ python setup.py bdist --formats=rpm

同时为了简化操做,setuptools 提供了以下命令:

Command Formats Notes
bdist_dumb tar, gztar, bztar, xztar, ztar, zip Windows 默认 zip, Unix 默认 gztar
bdist_rpm rpm, srpm  
bdist_wininst wininst  
bdist_msi msi  

因此上面打 rpm 包可使用:

$ python setup.py bdist_rpm

 

2-二、上传到Pypi

此时前置打包的步骤已经完成,能够开始进行上传。

1.利用twine将包上传上去,首先安装twine

pip install twine

 

2.注册 PyPI 帐号

登陆 https://pypi.python.org/pypi,注册帐号

 

3.上传

# 使用 upload
$ twine upload dist/* 输入 username 和 password 即上传至 PyPI。 # 若是不想每次输入帐号密码,能够在家目录下建立 .pypirc 文件,内容以下:
 [distutils] index-servers = pypi pypitest [pypi] username: password: [pypitest] repository: https://test.pypi.org/legacy/ username: password: 

 

4. 检验
这时候就能够,下载包,而后运行里面方法了

pip install hello
在本地测试的时候能够直接安装打包好的dist下的包: pip install xxx.tag.gz 测试功能正常后再上传到pypi
提示

 

5. 更新版本
更新版本也很简单,只须要修改setup.py下的version
而后从新生成档案,上传

python setup.py sdist bdist_wheel twine upload dist/hello-0.0.2*

 

6.更新本地moudle版本

pip install --upgrade hello 或者是先卸载,再安装 # 卸载hello
pip uninstall hello # 安装hello
pip install hello

 

 

3、setuptools的进阶使用

上面使用setuptools时只是简单的用一个配置文件setup.py就完成了打包信息填写。在真实的开发环境中,每每是多个文件配合。以openstack的打包为例。openstack中引入了Pbr的管理工具。

pbr是setuptools的辅助工具,最初为openstack开发,基于d2to1。Pbr会读取和过滤setup.cfg中的内容,而后将解析后的数据提供给setup.py做为参数。 setup.cfg提供setup.py的默认参数,同时易于修改。Setup.py先解析setup.cfg文件,而后执行相关命令。包括如下功能: 1、从git中获取Version,AUTHORS和ChangeLog信息 2、SphinxAutodoc。pbr会扫描project,找到全部模块,生成stubfiles 3、Requirements。读取requirements.txt文件,生成setup函数须要依赖包 四、long_description。从README.rst、README.txt或者READMEfile中生成long_description参数

 

Pbr的文件很简单,以下。配置以后会自动寻找目录下的setup.cfg文件,解析文件参数给setup.py使用。

https://docs.openstack.org/pbr/latest/user/using.html

setup.py

from setuptools import setup setuptools.setup( setup_requires=['pbr'], pbr=True)

 

setup.cfg

[metadata] name = my_package version = attr: src.VERSION description = My package description long_description = file: README.rst, CHANGELOG.rst, LICENSE.rst keywords = one, two license = BSD 3-Clause License classifiers = Framework :: Django License :: OSI Approved :: BSD License Programming Language :: Python :: 3 Programming Language :: Python :: 3.5 [files] packages = project_name data_files = etc/pbr = etc/pbr/* [global] setup-hooks = pbr.hooks.setup_hook [entry_points] console_scripts = project_name = project.cmd.mycmd:main [options] zip_safe = False include_package_data = True packages = find: scripts = bin/first.py bin/second.py install_requires = requests importlib; python_version == "2.7" [options.package_data] * = *.txt, *.rst hello = *.msg [options.extras_require] pdf = ReportLab>=1.2; RXP rest = docutils>=0.3; pack ==1.1, ==1.3 [options.packages.find] exclude = src.subpackage1 src.subpackage2 [options.data_files] /etc/my_package = site.d/00_default.conf host.d/00_default.conf data = data/img/logo.png, data/svg/icon.svg
相关文章
相关标签/搜索