Python程序包的构建和发布过程

关于我
一个有思想的程序猿,终身学习实践者,目前在一个创业团队任team lead,技术栈涉及Android、Python、Java和Go,这个也是我们团队的主要技术栈。
Github:https://github.com/hylinux1024
微信公众号:终身开发者(angrycode)

当我们开发了一个开源项目时,就希望把这个项目打包然后发布到pypi.org上,别人就可以通过pip install的命令进行安装。本文的教程来自于Python官方文档,如有不正确的地方欢迎评论拍砖。

0x00 创建项目

本文使用到的项目目录为

➜ packaging-tutorial . └── bestpkg └── __init__.py

接下来的所有操作都是在packing_tutorial这个目录下进行的。首先把bestpkg这个目录下的__init__.py添加以下内容

info='packaging demo'

这个信息主要用于打包成功后安装测试用的。

0x01 项目结构

一个待发布的项目还需要有以下这些文件:setup.py、LICENSE和README.md

➜ packaging-tutorial . ├── LICENSE ├── README.md ├── bestpkg │ └── __init__.py └── setup.py 0x02 setup.py

setup.py文件是给setuptools工具的使用脚本,告诉setuptools如何构建我们的项目。打开编辑器,编辑setup.py文件,输入以下内容

import setuptools # 读取项目的readme介绍 with open("README.md", "r") as fh: long_description = fh.read() setuptools.setup(,# 项目名称,保证它的唯一性,不要跟已存在的包名冲突即可 version="0.0.1", author="hylinux1024", # 项目作者 author_email="hylinux1024@gmail.com", description="一个牛逼的程序", # 项目的一句话描述 long_description=long_description, long_description_content_type="text/markdown", url="https://github.com/hylinux1024/niubiproject",# 项目地址 packages=setuptools.find_packages(), classifiers=[ "Programming Language :: Python :: 3", "License :: OSI Approved :: MIT License", "Operating System :: OS Independent", ], )

name
项目名称,保证它的唯一性,不要跟已存在的包名冲突即可,否则会发布失败

version
版本号

author
作者

author_email
作者邮箱

description
一句话描述项目

long_description
项目详细说明,一般直接读取README.md的内容

url
项目的链接地址

packages
列出当前项目的包,一般直接使用find_packages()即可

classifiers
这里指定Python的兼容版本是Python3,也指定了项目使用的开源协议。

0x03 README.md

给项目添加详细的README

# Example Package This is a simple example package. You can use [Github-flavored Markdown](https://guides.github.com/features/mastering-markdown/) to write your content. 0x04 LICENSE

要发布包到pypi上,选择一个合适的开源协议是非常重要的。如果不知道怎么选可以到https://choosealicense.com/这里看看。

0x05 项目打包

项目需要打包后才能发布,要打包项目需先安装最新版本的setuptools和wheel

➜ python3 -m pip install --user --upgrade setuptools wheel

然后使用以下命令进行打包

➜ python3 setup.py sdist bdist_wheel

当看到以下信息,说明已经打包成功

... ... ... adding license file "LICENSE" (matched pattern "LICEN[CS]E*") creating build/bdist.macosx-10.14-x86_64/wheel/bestpkg-0.0.1.dist-info/WHEEL creating 'dist/bestpkg-0.0.1-py3-none-any.whl' and adding 'build/bdist.macosx-10.14-x86_64/wheel' to it adding 'bestpkg/__init__.py' adding 'bestpkg-0.0.1.dist-info/LICENSE' adding 'bestpkg-0.0.1.dist-info/METADATA' adding 'bestpkg-0.0.1.dist-info/WHEEL' adding 'bestpkg-0.0.1.dist-info/top_level.txt' adding 'bestpkg-0.0.1.dist-info/RECORD' removing build/bdist.macosx-10.14-x86_64/wheel

在项目目录下会生成一个dist和build文件夹

➜ packaging-tutorial tree . ├── LICENSE ├── README.md ├── bestpkg │ └── __init__.py ├── bestpkg.egg-info │ ├── PKG-INFO │ ├── SOURCES.txt │ ├── dependency_links.txt │ └── top_level.txt ├── build │ ├── bdist.macosx-10.14-x86_64 │ ├── bdist.macosx-10.9-x86_64 │ └── lib │ └── bestpkg │ └── __init__.py ├── dist │ ├── bestpkg-0.0.1-py3-none-any.whl │ └── bestpkg-0.0.1.tar.gz └── setup.py 8 directories, 11 files

在dist文件中有两个文件

dist ├── bestpkg-0.0.1-py3-none-any.whl └── bestpkg-0.0.1.tar.gz

tar.gz文件是源码文件压缩包,而.whl就是打包后的文件。最新的pip命令会安装这个.whl文件。

0x06 上传

现在就可以上传到Python索引库了。我们使用Test PyPI,这个是测试用的Pypi,本例子也是使用Test Pypi。

首先要到https://test.pypi.org/account/register/注册账号。本例中我注册的账号为:hylinux1024

然后使用twine工具来上传我们的包。使用以下命令进行安装:

➜ python3 -m pip install --user --upgrade twine

使用以下命令上传dist目录下的文件

➜ python3 -m twine upload --repository-url https://test.pypi.org/legacy/ dist/*

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zwzgpp.html