环境准备
- setuptools
- pip
- wheel
- twine
发布前准备
创建一个项目:
- 项目名称
- 包名称
- __init__.py
- 模块
- setup.py
- README.rst
- LICENSE.txt
- MANIFESY.in
命名建议
- 全部小写
- 多个单词以中划线作为分割,不要使用下划线(_)pip对下划线支持不是很好
- 不能和pypi上已有的包名重复
setup.py
作用:项目信息的配置文件,最重要的就是执行一个setup函数,通过这个函数来指明信息
实例
from distutils.core import setup
setup(形参1 = 实参1, 形参2 = 实参2)
建议使用:
from setuptools import setup
setup(形参1 = 实参1, 形参2 = 实参2)
参数说明:
名称 name
name = 'sz-lib‘
版本 version
version = ‘1.0.0’
描述信息 description
description = ’this is a very niubi lib‘
需要处理的包列表 packages
packages = [‘szlib’]
需要处理的单文件模块列表 py_modules
py_modules = [‘single_module’]
作者 author
author = ‘sz’
作者邮箱 author_email
author_email = ‘xxx@qq.com’
长描述 long_description, 会显示在pypi的项目介绍中
long_description = ‘描述’
依赖的其他包 install_requires
install_requires = [‘requests>2.18’]
python 版本限制 python_requires
python_requires=’>=3’
项目主页地址 url
url = ‘https://’
协议 license
license = ‘MIT’
具体setup.py 脚本文档: Packaging Python Projects
README.rst
rst: reStructuredText
重新构建的文本
作用:
可以使用特定的字符,来描述文本的格式
pypi平台能够自动识别long_description字段中所写的这种格式的字符串,但是如果把这些字符串都写在一个单独的README.rst文件中,然后在setup.py文件中,读取这个文件内容,并赋值给long_description
语法检测
有时会发现,写的rst文件,无法在Pypi平台正常显示,pypi上对于rst的解析器并不是sphinx,导致部分语法有一些差异
解决方法,先从本地对long_description进行验证,之后再上传
pip install readme_renderer
python setup.py check -r -s
产生html:
python C:\Users\wqr57\appdata\local\programs\python\Python37\Scripts\rst2html.py .\README.rst a.html
LICENSE.txt
作用:声明库的一些使用责任等等,比如所有权归属,别人是否可以对代码进行任何操作,是否可以用于其他商业用途等等
choosealicense
MANIFEST.in
用于声明需要打包的文件,如,LICENSE.txt
setuptools 打包会自动添加README.rst, distutils则不会,需要再MANIFEST.in中添加
include LICENSE.txt
include README.rst
Specifying the files to distribute
编译生成发布包
查看帮助:
py .\setup.py --help-commands
生成源码压缩包,包含setup.py,模块源文件,数据源文件等,可以使用在任何平台上重新编译所有内容
–formats=压缩格式1,压缩格式2
python .\setup.py sdist
python .\setup.py sdist --formats=zip,tar
bdist 生成二进制发行包,不包含setup.py,是某个特定平台和python版本的一个存档
python .\setup.py bdist
python .\setup.py bdist_egg
生成egg包,需要安装setuptools
python .\setup.py bdist_wheel
生成wheel包,需要安装wheel
python .\setup.py bdist_wininst
生成exe
上传包到pypi
需要提前安装 twine
twine upload dist/sztestlib-1.0.0.zip
twine upload dist/sztestlib-1.0.0.whl
区分模块的测试与发布状态
借助 __name__ 来区分py文件被执行的模式
py直接被执行,此值为 __main__
被当作模块来执行,此值为模块名称
# py文件的入口
if __name__ == '__mian__':
在此py 中可被执行,其他import 则不会被执行
包的入口为 __main__.py
python 包名称
# 则会执行模块中的__main__.py