Python打包之setuptools
一、setuptools介绍
Setuptools是Python Distutils的加强版,使开发者构建和发布Python包更加容易,特别是当包依赖于其他包时。用setuptools构建和发布的包与用Distutils发布的包是类似的。包的使用者无需安装setuptools就可以使用该包。如果用户是从源码包开始构建,并且没有安装过setuptools的话,则只要在你的setup脚本中包含一个bootstrap模块(ez_setup),用户构建时就会自动下载并安装setuptools了。
功能亮点:
- 利用EasyInstall自动查找、下载、安装、升级依赖包
- 创建Python Eggs
- 包含包目录内的数据文件
- 自动包含包目录内的所有的包,而不用在setup.py中列举
- 自动包含包内和发布有关的所有相关文件,而不用创建一个MANIFEST.in文件
- 自动生成经过包装的脚本或Windows执行文件
- 支持Pyrex,即在可以setup.py中列出.pyx文件,而最终用户无须安装Pyrex
- 支持上传到PyPI
- 可以部署开发模式,使项目在sys.path中
- 用新命令或setup()参数扩展distutils,为多个项目发布/重用扩展
- 在项目setup()中简单声明entry points,创建可以自动发现扩展的应用和框架
二、简单的例子
python中安装包的方式有很多种:
- 源码包:python setup.py install
- 在线安装:pip install 包名 / easy_install 包名
pip install的东西从哪里来的?
从PyPI (Python Package Index)来的,官网是: https://pypi.python.org/pypi
执行pip install terminaltranslator命令的时候,它就会去从官方网站搜terminaltranslator,搜到了就下载压缩包并解压安装,如果没有搜索到就会报错。
1、源码包安装
源码包安装就是你在本地编写好了一个模块,自己安装在本地使用,别人(即使是你自己)都不能 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
2、打包上传到pypi
2-1、配置文件和打包
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-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
三、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函数需要依赖包 4、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
Python打包之setuptools的更多相关文章
- Python打包工具setuptools的使用
将我们写的Python程序发布成包后,可以使其能够安装使用. 在项目上测试的时候,某些情况下,可以将Python打包,然后上传到测试服务器,安装测试. setuptools是常用的打包工具. 一个简单 ...
- 跟Python打包相关的一些文章
6 things I learned about setuptools Python 101: easy_install or how to create eggs « The Mouse Vs. T ...
- Python 打包中 setpy.py settuptools pbr 的了解
背景 nova服务构建失败,报错: 'tests_require' must be a string or list of strings containing valid project/versi ...
- python 自动安装工具 setuptools(easy_install) 的使用
1.下载安装 python 安装工具,下载地址:http://pypi.python.org/pypi/setuptools ,可以找到正确的版本进行下载. 2.解压缩后双击 ez_setup.py ...
- Python 打包的现状:包的三种类型
英文 | The state of Python Packaging[1] 原作 | BERNAT GABOR 译者 | 豌豆花下猫 声明 :本文获得原作者授权翻译,转载请保留原文出处,请勿用于商业或 ...
- Python 打包——过去、现在与未来
英文 | Python packaging - Past, Present, Future[1] 原作 | BERNAT GABOR 译者 | 豌豆花下猫 声明 :本文获得原作者授权翻译,转载请保留原 ...
- Python 打包和发布方法汇总
以下主要Python打包汇总,作为学习备份: 一.使用python内部基础工具包Distutils打包程序 1. 在打包之前需要做的就是配置好安装脚本,一般为setup.py文件: 示例(setup. ...
- python打包成exe
目前有三种方法可以实现python打包成exe,分别为 py2exe Pyinstaller cx_Freeze 其中没有一个是完美的 1.py2exe的话不支持egg类型的python库 2.Pyi ...
- 反编译python打包的exe文件
目录 1.前言 2.使用环境 3.还原过程 4.号外 5.exe文件和所用到的反编译工具 6.参考 7.去签名(补漏) 前言 拿到了利用驱动人生进行传播的病毒样本,发现是python打包成的exe文件 ...
随机推荐
- JVM系列之一 JVM的基础概念与内存区域
前言 作为一名 Java 语言的使用者,学习 JVM 有助于解决程序运行过程中出现的问题.写出性能更高的代码. 可以说:学好 JVM 是成为中高级 Java 工程师的必经之路. 有感于从未整理归纳 J ...
- value-key
value-key object 如果 Select 的绑定值为对象类型,请务必指定 value-key 作为它的唯一性标识. value-key 作为 value 唯一标识的键名,绑定值为对象类型时 ...
- 法兰西金融专访SPC空投重磅来袭
最近,法兰西金融日报联合德意志财经等知名金融媒体就SPC这一话题进行了专访. 法兰西金融日报记者德维尔斯问到,之前2020年的BGV项目等市场反响异常火爆,2021年已经来到,NGK目前有何新的大动作 ...
- webpack + ts 配置路径别名无死角方法总结
webpack + ts 配置路径别名总结 自我体验加总结:在配置脚手架时,定制别名很有必要,可以使得代码更优雅,可读性更强.但在使用ts的时候,即便项目能够运行,vscode 确时长会提示 can' ...
- 若依管理系统RuoYi-Vue(二):权限系统设计详解
若依Vue系统中的权限管理部分的功能都集中在了系统管理菜单模块中,如下图所示.其中权限部分主要涉及到了用户管理.角色管理.菜单管理.部门管理这四个部分. 一.若依Vue系统中的权限分类 根据观察,若依 ...
- 大小厂必问Java后端面试题(含答案)
你好,我是yes. 这个系列的文章不会是背诵版,不是那种贴上标准答案,到时候照着答就行的面试题汇总. 我会用大白话尽量用解释性.理解性的语言来回答,但是肯定没有比平时通过一篇文章来讲解清晰,不过我尽量 ...
- Python算法_爬楼梯(08)
假设你正在爬楼梯.需要 n 阶你才能到达楼顶. 每次你可以爬 1 或 2 个台阶.你有多少种不同的方法可以爬到楼顶呢? 注意:给定 n 是一个正整数. 示例 1: 输入: 2输出: 2解释: 有两种方 ...
- servlet内置对象(传递数据)
一个servlet向另一个servlet发送数据,可以将数据放置在一个容器中(io.数据库.servlet的内置对象),servlet的内置对象成本最小. 一共有三个内置对象. 名字 类型 reque ...
- close() 和fluse()区别
1.close()默认包含了一次flush()操作,关闭之后,就不能再写入了. 2.flush()刷新,flush()之后,可以接着写入. 3.缓冲区默认大小是8192字节,如果小于8192字节,不会 ...
- Echart饼图旋转
1 <!DOCTYPE html> 2 <html lang="en"> 3 4 <head> 5 <meta charset=" ...