python基础知识专题 - 模块的打包和发布

简介: python基础知识专题 - 模块的打包和发布

分发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

目录
相关文章
|
4月前
|
开发者 Python
如何在Python中管理模块和包的依赖关系?
在实际开发中,通常会结合多种方法来管理模块和包的依赖关系,以确保项目的顺利进行和可维护性。同时,要及时更新和解决依赖冲突等问题,以保证代码的稳定性和可靠性
175 62
|
2月前
|
测试技术 Python
【03】做一个精美的打飞机小游戏,规划游戏项目目录-分门别类所有的资源-库-类-逻辑-打包为可玩的exe-练习python打包为可执行exe-优雅草卓伊凡-持续更新-分享源代码和游戏包供游玩-1.0.2版本
【03】做一个精美的打飞机小游戏,规划游戏项目目录-分门别类所有的资源-库-类-逻辑-打包为可玩的exe-练习python打包为可执行exe-优雅草卓伊凡-持续更新-分享源代码和游戏包供游玩-1.0.2版本
157 31
【03】做一个精美的打飞机小游戏,规划游戏项目目录-分门别类所有的资源-库-类-逻辑-打包为可玩的exe-练习python打包为可执行exe-优雅草卓伊凡-持续更新-分享源代码和游戏包供游玩-1.0.2版本
|
14天前
|
人工智能 自然语言处理 Shell
[oeasy]python070_如何导入模块_导入模块的作用_hello_dunder_双下划线
本文介绍了如何在Python中导入模块及其作用,重点讲解了`__hello__`模块的导入与使用。通过`import`命令可以将外部模块引入当前环境,增强代码功能。例如,导入`__hello__`模块后可输出“Hello world!”。此外,还演示了如何使用`help()`和`dir()`函数查询模块信息,并展示了导入多个模块的方法。最后,通过一个实例,介绍了如何利用`jieba`、`WordCloud`和`matplotlib`模块生成词云图。总结来说,模块是封装好的功能部件,能够简化编程任务并提高效率。未来将探讨如何创建自定义模块。
33 8
|
11天前
|
缓存 Shell 开发工具
[oeasy]python071_我可以自己做一个模块吗_自定义模块_引入模块_import_diy
本文介绍了 Python 中模块的导入与自定义模块的创建。首先,我们回忆了模块的概念,即封装好功能的部件,并通过导入 `__hello__` 模块实现了输出 "hello world!" 的功能。接着,尝试创建并编辑自己的模块 `my_file.py`,引入 `time` 模块以获取当前时间,并在其中添加自定义输出。
21 4
|
3月前
|
Python
Python Internet 模块
Python Internet 模块。
140 74
|
4月前
|
算法 数据安全/隐私保护 开发者
马特赛特旋转算法:Python的随机模块背后的力量
马特赛特旋转算法是Python `random`模块的核心,由松本真和西村拓士于1997年提出。它基于线性反馈移位寄存器,具有超长周期和高维均匀性,适用于模拟、密码学等领域。Python中通过设置种子值初始化状态数组,经状态更新和输出提取生成随机数,代码简单高效。
153 63
|
4月前
|
数据可视化 Python
如何在Python中解决模块和包的依赖冲突?
解决模块和包的依赖冲突需要综合运用多种方法,并且需要团队成员的共同努力和协作。通过合理的管理和解决冲突,可以提高项目的稳定性和可扩展性
|
4月前
|
Python
Python的模块和包
总之,模块和包是 Python 编程中非常重要的概念,掌握它们可以帮助我们更好地组织和管理代码,提高开发效率和代码质量
142 61
|
4月前
|
测试技术 Python
手动解决Python模块和包依赖冲突的具体步骤是什么?
需要注意的是,手动解决依赖冲突可能需要一定的时间和经验,并且需要谨慎操作,避免引入新的问题。在实际操作中,还可以结合使用其他方法,如虚拟环境等,来更好地管理和解决依赖冲突😉。
|
4月前
|
持续交付 Python
如何在Python中自动解决模块和包的依赖冲突?
完全自动解决所有依赖冲突可能并不总是可行,特别是在复杂的项目中。有时候仍然需要人工干预和判断。自动解决的方法主要是提供辅助和便捷,但不能完全替代人工的分析和决策😉。

热门文章

最新文章