下面是由社区开发者——王方浩提供的文章,本文主要介绍 Python打包发布。
王方浩,社区布道师,武汉大学电子信息专业,先后在华为和阿里从事固件、驱动、操作系统和后台相关的开发工作,目前主要从事L4级别自动驾驶的开发,喜欢研究技术,分析源码和解答问题,目前活跃于Apollo自动驾驶开源社区,平时喜欢做一些户外运动,对自动驾驶的前景担心的同时又充满激情,“莫愁前路无知己,天下谁人不识君”,希望更多的人一起!
ENJOY THE FOLLOWING
本文将主要从以下几个方面来介绍:
包(package)和模块(module)
打包
安装
统计信息
参考
Python由于其灵活性和丰富的库,使用起来非常方便,在这里主要介绍Ppython的包管理机制,包括Python包的组织架构,如何打包和发布Python包,以及PIP的使用。
Python的包是一些系列功能的合集,而模块则是单个或者几个模块,包通常的形式是
package
init.py
a.py
b.py
…
这里的init.py是必须的,来标识这是一个Package,之后就可以通过Import的方式引用了。
而模块(Module),可以是单个或者几个文件,通过在setup.py 中py_modules关键字来进行指定。
Python通过setup.py 或setup.cfg 进行打包,打包之后的文件在Dist目录中,其中setuptools默认会添加以下几种文件:
all Python source files implied by the py_modules and packages setup() arguments
all C source files mentioned in the ext_modules or libraries setup() arguments
scripts specified by the scripts setup() argument
all files specified by the package_data and data_filessetup() arguments
the file specified by the license_file option in setup.cfg (setuptools 40.8.0+)
all files specified by the license_files option in setup.cfg (setuptools 42.0.0+)
all files matching the pattern test/test*.py
setup.py (or whatever you called your setup script)
setup.cfg
README
README.txt
README.rst (Python 3.7+ or setuptools 0.6.27+)
README.md (setuptools 36.4.0+)
pyproject.toml (setuptools 43.0.0+)
MANIFEST.in
如果要添加其它类型的文件,例如数据库文件,图片文件等,可以在package_data中进行添加 。
如果要添加库依赖,例如Python依赖于某个c++的So文件,可以通过Extension进行添加,在打包的时候,Python会编译其中的 .c文件,然后一起打包。
实际上由于Python是解析性语言,打包之后的文件只是拷贝并且解压到Python指定的库安装目录,由于库的路径已经加入了sys.path因此就可以调用这些库了。
命令行
如果你需要安装一个Python命令(通过命令行输入命令并且执行),setuptools提供了entry_points 来指定输入命令之后运行的函数,还可以结合argparse进行参数解析,这样就可以实现python命令安装了。
包上传
打包好的文件,要上传到PYPI网站进行托管,上传之后,其它人就可以通过pip来安装对应的软件包,并且使用了。Python官方提供了twine命令来上传包,在使用之前,首先需要注册pypi的账号,然后上传,上传之前需要输入PYPI的账号和密码。
twine upload dist/*
之后就可以在PYPI网站上看到上传的包了,还可以在PYPI网站管理。注意上传的软件包的版本不能重复上传,请节省版本号。也可以通过Github Action和PYPI结合,实现在Github上自动发布版本。
Python通过pip命令来安装软件包,安装完成之后,就可以通过Import模块的方式,或者命令行的方式来使用安装包了。
pip既可以通过远程仓库安装,也可以通过本地安装,本地安装主要是用于没有网络或者测试的时候,远程安装是正式发布版本。
安装依赖
Python的安装依赖在上面说的setup.py中的install_requires进行指定,安装的时候,pip会主动下载并且安装这些依赖。
卸载
Python通过pip uninstall来卸载Python安装包,只会卸载自己,并不会卸载依赖项。
由于pypi不提供python库的下载次数,可以通过以下网站来查询库的历史下载次数。
https://pepy.tech/
2. Writing the Setup Script — Python 3.10.4 documentation
Distributing a Python command line application | Jan-Philip Gehrcke