分发Python模块
模块的打包和分发在很多语言中都是一个比较基础的操做,不论是java中的jar包还是python的轮子,它们都能让自己的代码可以更方便地让更多人使用,同时也方便更好地管理已经完成地代码。
1.安装python模块的构建(bulid)工具setuptools、wheel和twine
python -m pip install setuptools wheel twine
2.创建项目目录结构
要在本地创建该项目,请创建以下文件结构:
packaging_folder └── yourpackage └── __init__.py
创建此目录文件结构后,您将希望在顶级文件夹packaging_folder中运行本教程中的所有命令-则需要在cmd窗口(Windows)或者终端(Linux)中执行以下命令,进入到你的打包文件夹中。
cd packaging_folder
可以看到新建的packaging_folder文件夹中含有一个__init__.py
文件,这意味着packaging_folder本身也是一个python包。
yourpackage/__init__.py
表示你写好的将要打包的模块,模块需要一个初始化文件__init__.py,但也允许是一个空文件夹。
现在,您将创建一些文件来打包该项目并为分发做准备。创建下面列出的新文件,并将它们放置在项目的根目录中-您将在以下步骤中向其中添加内容。
packaging_folder ├── LICENSE ├── README.md ├── yourpackage │ └── __init__.py ├── setup.py └── tests
创建一个测试文件夹
tests/
表示用于放置单元测试文件的预留空文件夹。
3.创建setup.py文件
setup.py是setuptools的构建脚本。它告诉setuptools有关您的软件包(例如名称和版本)以及要包括的代码文件的信息。
打开setup.py并输入以下内容。更新软件包名称以包含您的用户名(例如example-pkg-theacodes),以确保您具有唯一的软件包名称,并且该软件包与本教程中其他人上传的软件包没有冲突。
import setuptools with open("README.md", "r", encoding="utf-8") as fh: long_description = fh.read() setuptools.setup( name="example-pkg-YOUR-USERNAME-HERE", # 替换为你自己的用户名 version="0.0.1", # 此模块的版本号 author="Example Author", # 作者名 author_email="author@example.com", # 作者邮箱 description="A small example package", # 一句话对你的模块简要描述 long_description=long_description, long_description_content_type="text/markdown", url="https://github.com/pypa/sampleproject", # 模块的主页,常常作者在github发布模块的页面 packages=setuptools.find_packages(), classifiers=[ "Programming Language :: Python :: 3", "License :: OSI Approved :: MIT License", "Operating System :: OS Independent", ], python_requires='>=3.7', # 你的包要求的的最低python版本 )
setup()中的常用参数含义
- name:是您的软件包的分发名称。
该名称可以是任何名称,只要仅包含字母,数字_和即可-。也一定不能在pypi.org上使用它。请务必使用您的用户名进行更新,因为这样可以确保您不会尝试上传与上传软件包时已经存在的软件包名称相同的软件包。- version:软件包的版本。
- author与author_email:用于标识软件包的作者和email。
- description :软件包的概述,用一句话描述。
- long_description是包装的详细说明。
这在Python软件包索引的软件包详细信息软件包中显示。在这种情况下,将加载详细描述,README.md这是常见的模式。- long_description_content_type:告诉索引用于长描述的标记类型。
- url:项目主页的URL。
对于许多项目,这仅是指向GitHub,GitLab,Bitbucket或类似代码托管服务的链接。- packages:是应该包含在分发包中的所有Python导入包的列表。
无需手动列出每个软件包,我们可以 用来自动发现所有软件包和子软件包。在这种情况下,软件包列表将是唯一存在的软件包。find_packages()example_pkg- classifiers:给出了指数和点子你的包一些额外的元数据。
在这种情况下,该软件包仅与Python 3兼容,已获得MIT许可,并且与操作系统无关。您应始终至少包括您的软件包所使用的Python版本,软件包所使用的许可证以及软件包所使用的操作系统。
【Note】每个项目的维护者都为PyPI提供了一个“trove classifiers”列表,以对每个发行版进行分类,描述发行版的用途,可以在哪些系统上运行以及成熟度如何。然后,社区成员可以使用这些标准化的分类器根据其所需标准查找项目。
4.创建README.md文件
打开README.md并输入以下内容。您可以根据需要自定义。
# 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.
5.创建许可证
对于上传到Python软件包索引的每个软件包,都必须包含许可证,这一点很重要。这会告诉安装软件包的用户使用条款。有关选择许可证的帮助,请参阅 https://choosealicense.com/。选择许可证后,打开 LICENSE并输入许可证文本。例如,如果您选择了MIT许可证:
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.
6.生成发布档案
下一步是为程序包生成分发程序包。这些是已上载到Package Index的归档文件,可以通过pip安装。
请确保你的电脑上安装了最新的setuptools和wheel ,可以通过以下方式安装:
python3 -m pip install --user --upgrade setuptools wheel
接下来,从相同目录运行此命令setup.py:
python3 setup.py sdist bdist_wheel
此命令应输出大量文本,一经完成,将在dist目录中生成两个文件:
dist/ example_pkg_YOUR_USERNAME_HERE-0.0.1-py3-none-any.whl example_pkg_YOUR_USERNAME_HERE-0.0.1.tar.gz
其中 tar.gz文件是源存档,而.whl文件是 内置分发。较新的pip版本优先安装内置发行版,但如果需要,将回落到源归档文件中。
您应该始终上传源档案,并为项目兼容的平台提供内置档案。在这种情况下,我们的示例包在任何平台上都与Python兼容,因此仅需要一个内置发行版。
7. 上传发布档案
最后,是时候将您的包上传到Python Package Index了!
TestPyPI是Python包索引(PyPI)的单独实例 ,可让您试用分发工具和过程,而不必担心会影响实际索引。TestPyPI托管在 test.pypi.org
您需要做的第一件事是在上注册一个帐户。测试PyPI是用于测试和实验的包索引的单独实例。对于像本教程这样的事情非常有用,我们不必上载到真实索引。要注册帐户,请访问Pypi用户注册并完成该页面上的步骤。
【注意】TestPyPI的数据库可能会定期删除,因此删除用户帐户并不罕见。
完成账户创建后将跳转到以下页面:
这时候,请注意查收您的邮箱,你会收到一封这样的邮件:
点击"click this link to verify your email address"在以下页面中输入你创建账户时的密码,并单机Confirm password按钮。
现在,您将创建一个PyPI API令牌,以便能够安全地上传您的项目。
当将包上传到PyPI时,API令牌提供了另一种方式(而不是用户名和密码)进行身份验证。您可以为整个PyPI帐户创建令牌,在这种情况下,令牌将适用于与该帐户关联的所有项目。或者,您可以将令牌的范围限制为特定项目。
关于令牌的详细信息请参考https://test.pypi.org/help/#apitoken