一、python打包创建SDK 1、首先,我们需要一个工具包来协助我们完成python打包的任务
2、之后封装好你的项目api 目录结构
├─python-sdk │ │ README.md
│ │ setup.py
│ └─Demo
| | demo.py
| │ __init__.py
|
Demo/demo.py.py中只有一个输出函数demo(),这里可以自行封装自己的api
3、编写setup.py文件,用于安装Demo包 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 setup.py各参数介绍: --name 包名称 --version (-V) 包版本 --author 程序的作者 --author_email 程序的作者的邮箱地址 --maintainer 维护者 --maintainer_email 维护者的邮箱地址 --url 程序的官网地址 --license 程序的授权信息 --description 程序的简单描述 --long_description 程序的详细描述 --platforms 程序适用的软件平台列表 --classifiers 程序的所属分类列表 --keywords 程序的关键字列表 --packages 需要处理的包目录(包含__init__.py的文件夹) --py_modules 需要打包的python文件列表 --download_url 程序的下载地址 --cmdclass --data_files 打包时需要打包的数据文件,如图片,配置文件等 --scripts 安装时需要执行的脚步列表 --package_dir 告诉setuptools哪些目录下的文件被映射到哪个源码包。一个例子:package_dir = {'': 'lib'},表示“root package”中的模块都在lib 目录中。 --requires 定义依赖哪些模块 --provides定义可以为哪些模块提供依赖 --find_packages() 对于简单工程来说,手动增加packages参数很容易,刚刚我们用到了这个函数,它默认在和setup.py同一目录下搜索各个含有 __init__.py的包。 其实我们可以将包统一放在一个src目录中,另外,这个包内可能还有aaa.txt文件和data数据文件夹。另外,也可以排除一些特定的包 find_packages(exclude=["*.tests", "*.tests.*", "tests.*", "tests"]) --install_requires = ["requests"] 需要安装的依赖包 --entry_points 动态发现服务和插件,下面详细讲
下列entry_points中: console_scripts 指明了命令行工具的名称;在“redis_run = RedisRun.redis_run:main”中,等号前面指明了工具包的名称,等号后面的内容指明了程序的入口地址。
1 2 3 1 entry_points={'console_scripts': [ 2 'redis_run = RedisRun.redis_run:main', 3 ]}
这里可以有多条记录,这样一个项目就可以制作多个命令行工具了,比如:
1 2 3 4 5 6 7 1 setup( 2 entry_points = { 3 'console_scripts': [ 4 'foo = demo:test', 5 'bar = demo:test', 6 ]} 7 )
1、setup.py的项目示例代码 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 1 #!/usr/bin/env python 2 # coding=utf-8 3 4 from setuptools import setup 5 6 ''' 7 把redis服务打包成C:\Python27\Scripts下的exe文件 8 ''' 9 10 setup( 11 name="RedisRun", #pypi中的名称,pip或者easy_install安装时使用的名称,或生成egg文件的名称 12 version="1.0", 13 author="Andreas Schroeder", 14 author_email="andreas@drqueue.org", 15 description=("This is a service of redis subscripe"), 16 license="GPLv3", 17 keywords="redis subscripe", 18 url="https://ssl.xxx.org/redmine/projects/RedisRun", 19 packages=['RedisRun'], # 需要打包的目录列表 20 21 # 需要安装的依赖 22 install_requires=[ 23 'redis>=2.10.5', 24 'setuptools>=16.0', 25 ], 26 27 # 添加这个选项,在windows下Python目录的scripts下生成exe文件 28 # 注意:模块与函数之间是冒号: 29 entry_points={'console_scripts': [ 30 'redis_run = RedisRun.redis_run:main', 31 ]}, 32 33 # long_description=read('README.md'), 34 classifiers=[ # 程序的所属分类列表 35 "Development Status :: 3 - Alpha", 36 "Topic :: Utilities", 37 "License :: OSI Approved :: GNU General Public License (GPL)", 38 ], 39 # 此项需要,否则卸载时报windows error 40 zip_safe=False
2、简单setup.py的项目示例代码 上边的setup.py比较复杂,参数较多,可根据自己的实际情况做删减,
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 import setuptools # 打包: python setup.py sdist # 对包进行检查: twine check dist/* # 运行上传: twine upload dist/* --config-file .pypirc # 读取项目的readme介绍 with open("README.md", "r") as fh: long_description = fh.read() setuptools.setup( name="******SDK", version="1.0.2", author="******", # 项目作者 author_email="******@qq.com", description="This is the official Python SDK for Niffler Analytics.", long_description=long_description, long_description_content_type="text/markdown", url="******", packages=setuptools.find_packages(), )
二、用Python将库打包发布到pypi 如果需要将自己写好的python打包,并发布到pypi,这样其他人就可以直接通过pip install来安装对应的包,可以参考如下教程
1. 注册pypi账号并创建token 然后选择API token->Add API token
输入token name并在Scope中选择Entire account(第一次需要选择Entire account) 然后在本地,修改.pypirc
文件 输入的内容为:
1 2 3 [pypi] username = __token__ password = {token}
只需要修改{token}
为自己的token即可
2、打包 打包命令为python setup.py cmd
cmd可以取值为
1 2 3 4 5 6 7 bdist_wheel : create a wheel distribution bdist_egg : create an “egg” distribution sdist : create a source distribution (tarball, zip file, etc.) bdist : create a built (binary) distribution bdist_dumb : create a “dumb” built distribution bdist_rpm : create an RPM distribution bdist_wininst : create an executable installer for MS Windows
打包为tar.gz
3、上传 安装twine pip install twine
可以首先使用twine
对包进行检查
输出如下
再运行上传命令
数据注册好的pypi的用户名密码即可,如果在.pypirc
文件中配置了用户名密码,也可以直接指定这个文件为配置文件
可以用Makefile来自动运行打包上传
1 2 3 4 5 6 7 8 9 10 11 upload: ## 编译dockerbase @echo "===========start...===========" rm -rf ./dist rm -rf ./NifflerAnalyticsSDK.egg-info @echo "===========python setup.py sdist...===========" python setup.py sdist @echo "===========check...===========" twine check dist/* @echo "===========upload...===========" twine upload dist/* --config-file .pypirc @echo "===========finished...==========="