如何编写和发布 Python 包

news2024/11/15 5:16:56

编写和发布Python包是软件开发中非常常见的一项任务。通过创建Python包,开发者可以更好地组织代码,促进代码复用,并且便于共享和分发自己的代码库。

一、准备工作

在开始编写Python包之前,确保你已经安装了以下工具:

  1. Python:建议使用Python 3.6以上版本。
  2. pip:Python的包管理工具。
  3. setuptools:用于打包Python项目的工具。
  4. twine:用于将包上传到PyPI(Python Package Index)。

可以使用以下命令来安装所需工具:

pip install setuptools twine

二、编写Python包

1. 创建项目结构

首先,创建一个项目目录,并在该目录下创建必要的文件和文件夹。假设我们的包名为mypackage,项目结构如下:

mypackage/
│
├── mypackage/
│   ├── __init__.py
│   ├── module1.py
│   └── module2.py
│
├── tests/
│   ├── __init__.py
│   └── test_module1.py
│
├── setup.py
├── README.md
└── LICENSE

2. 编写包代码

mypackage文件夹中创建两个模块文件module1.pymodule2.py。这些模块中可以包含你希望打包和发布的代码。例如:

module1.py

def add(a, b):
    return a + b

def subtract(a, b):
    return a - b

module2.py

def multiply(a, b):
    return a * b

def divide(a, b):
    if b == 0:
        raise ValueError("Cannot divide by zero!")
    return a / b

mypackage/__init__.py中导入这些模块:

from .module1 import add, subtract
from .module2 import multiply, divide

3. 编写测试代码

tests文件夹中编写测试代码。确保你的代码功能正常。在这里我们使用unittest库进行测试。

test_module1.py

import unittest
from mypackage import add, subtract

class TestModule1(unittest.TestCase):

    def test_add(self):
        self.assertEqual(add(3, 4), 7)

    def test_subtract(self):
        self.assertEqual(subtract(10, 4), 6)

if __name__ == '__main__':
    unittest.main()

4. 编写setup.py

setup.py是包的配置文件,用于定义包的信息和依赖项。内容如下:

from setuptools import setup, find_packages

setup(
    name="mypackage",
    version="0.1.0",
    description="A simple example Python package",
    long_description=open('README.md').read(),
    long_description_content_type='text/markdown',
    author="Your Name",
    author_email="your.email@example.com",
    url="https://github.com/yourusername/mypackage",
    packages=find_packages(),
    classifiers=[
        "Programming Language :: Python :: 3",
        "License :: OSI Approved :: MIT License",
        "Operating System :: OS Independent",
    ],
    python_requires='>=3.6',
)

5. 编写README.md

README.md文件包含包的介绍、安装方法和使用示例。

# mypackage

A simple example Python package.

## Installation

```sh
pip install mypackage

Usage

from mypackage import add, subtract, multiply, divide

print(add(3, 4))  # Output: 7
print(subtract(10, 4))  # Output: 6
print(multiply(3, 4))  # Output: 12
print(divide(10, 2))  # Output: 5.0

三、构建和发布包

1. 构建包

使用`setuptools`和`twine`构建包。在项目根目录运行以下命令:

python setup.py sdist bdist_wheel

这将创建两个文件夹distbuild,其中dist文件夹中包含了构建好的包文件。

2. 发布包

发布包之前,需要在PyPI注册一个账户,然后创建一个API token以便安全地上传包。

2.1 注册PyPI账户

访问PyPI官网,注册一个新账户。

2.2 创建API token

登录后,进入你的账户设置页面,创建一个新的API token。确保将其保存到安全的地方。

2.3 上传包

使用twine将包上传到PyPI。在项目根目录运行以下命令:

twine upload dist/*

系统会提示你输入PyPI账户的用户名和密码或API token。使用API token进行认证:

twine upload -u __token__ -p <your-api-token> dist/*

如果一切顺利,你的包就会成功上传到PyPI,并可以通过pip进行安装了。

四、使用和维护包

1. 安装和使用包

一旦包上传到PyPI,你就可以在任何地方通过pip安装并使用它:

pip install mypackage

然后在你的Python代码中导入并使用:

from mypackage import add, subtract, multiply, divide

print(add(3, 4))
print(subtract(10, 4))
print(multiply(3, 4))
print(divide(10, 2))

2. 维护和更新包

随着时间的推移,你可能需要对包进行更新和维护。更新包的过程与初次发布包的步骤相同,只需修改包的版本号,并确保所有修改都经过测试。

2.1 更新版本号

setup.py中更新版本号,例如:

version="0.2.0",
2.2 构建和上传新版本

运行以下命令构建并上传新版本:

python setup.py sdist bdist_wheel
twine upload dist/*

3. 提供文档

为了方便用户使用你的包,提供详细的文档是非常重要的。你可以使用工具如Sphinx来生成文档,并将其托管在Read the Docs等平台上。

五、示例项目

这里提供一个完整的示例项目,供参考:

项目结构

example_package/
│
├── example_package/
│   ├── __init__.py
│   ├── arithmetic.py
│
├── tests/
│   ├── __init__.py
│   └── test_arithmetic.py
│
├── setup.py
├── README.md
└── LICENSE

包代码

example_package/arithmetic.py

def add(a, b):
    return a + b

def subtract(a, b):
    return a - b

def multiply(a, b):
    return a * b

def divide(a, b):
    if b == 0:
        raise ValueError("Cannot divide by zero!")
    return a / b

example_package/init.py

from .arithmetic import add, subtract, multiply, divide

测试代码

tests/test_arithmetic.py

import unittest
from example_package import add, subtract, multiply, divide

class TestArithmetic(unittest.TestCase):

    def test_add(self):
        self.assertEqual(add(3, 4), 7)

    def test_subtract(self):
        self.assertEqual(subtract(10, 4), 6)

    def test_multiply(self):
        self.assertEqual(multiply(3, 4), 12)

    def test_divide(self):
        self.assertEqual(divide(10, 2), 5.0)

        with self.assertRaises(ValueError):
            divide(10, 0)

if __name__ == '__main__':
    unittest.main()

setup.py

from setuptools import setup, find_packages

setup(
    name="example_package",
    version="0.1.0",
    description="A simple example Python package",
    long_description=open('README.md').read(),
    long_description_content_type='text/markdown',
    author="Your Name",
    author_email="your.email@example.com",
    url="https://github.com/yourusername/example_package",
    packages=find_packages(),
    classifiers=[
        "Programming Language :: Python :: 3",
        "License :: OSI Approved :: MIT License",
        "Operating System :: OS Independent",
    ],
    python_requires='>=3.6',
)

README.md

# example_package

A simple example Python package.

## Installation

```sh
pip install example_package

Usage

from example_package import add, subtract, multiply, divide

print(add(3, 4))  # Output: 7
print(subtract(10, 4))  # Output: 6
print(multiply(3, 4))  # Output: 12
print(divide(10, 2))  # Output: 5.0

构建和上传包

python setup.py sdist bdist_wheel
twine upload dist/*

通过以上步骤,我们已经成功创建、测试、打包并发布了一个Python包。此过程不仅可以帮助你更好地组织和管理代码,也为其他开发者提供了方便使用的工具。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1981554.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Chainlit快速实现AI对话应用的界面定制化教程

前言 本文主要讲解如何自定义chainlit实现的网页界面的中的一些可以自定修改的样式的实现教程。比如修改自己的logo网站图标或者主题等 翻译 chainlit 默认网页界面显示的是英文&#xff0c;如果我们想显示为其他语言可以进行以下操作。 翻译文件位于项目根目录下的.chainli…

02 部署LVS-DR群集

2.1&#xff1a;直接路由模式&#xff08;LVS-DR&#xff09; 实验环境 关闭所有测试环境的防火墙 [rootbogon ~]# systemctl stop firewalld [rootbogon ~]# setenforce 0 1.配置LVS调速器 &#xff08;1&#xff09;配置虚拟IP地址VIP [rootlvs ~]# cd /etc/sysconfig/n…

53 程序控制结构精彩案例

1 输入若干成绩&#xff0c;求所有成绩的平均分。每输入一个成绩后询问是否继续输入下一个成绩&#xff0c;回答 yes 就继续输入下一个成绩&#xff0c;回答 no 就停止输入成绩。 scores [] # 使用列表存放临时数据 while True:x input(score: )try:scores.append(float(x)…

CEP 复杂事件处理引擎入门:初级高频量价因子策略的实现

高频交易&#xff08;High-Frequency Trading, HFT&#xff09;作为现代金融市场中的重要组成部分&#xff0c;以其高速、自动化和复杂的算法交易策略而著称。高频交易策略通过分析大量实时变化的市场数据&#xff0c;利用市场的微小价格波动迅速做出交易决策&#xff0c;从而在…

【游戏引擎之路】登神长阶(九)——《3D游戏编程大师技巧》:我想成为游戏之神!

5月20日-6月4日&#xff1a;攻克2D物理引擎。 6月4日-6月13日&#xff1a;攻克《3D数学基础》。 6月13日-6月20日&#xff1a;攻克《3D图形教程》。 6月21日-6月22日&#xff1a;攻克《Raycasting游戏教程》。 6月23日-7月1日&#xff1a;攻克《Windows游戏编程大师技巧》。 7月…

浅谈如何将本地代码提交至gitee

文章目录 一、下载git工具二、新建文件夹三、输入命令 [默认提交至master分支] 一、下载git工具 git官网 二、新建文件夹 随便在本机的任意位置新建一个文件夹都行。我以我本机的桌面新建一个文件夹为例&#xff0c;此文件夹可随意命名。 点击该文件夹&#xff0c;右键——…

大奖放送 | AI编程达人秀视频文章征集大赛来啦!

AI Coding&#xff0c;可以有多少种打开玩法&#xff1f;腾讯云AI代码助手是一款辅助编码工具&#xff0c;基于混元大模型&#xff0c;提供技术对话、代码补全、代码诊断和优化等能力&#xff0c;为你生成优质代码&#xff0c;帮你解决技术难题&#xff0c;提升编码效率。 我…

elasticsearch的学习(二):Java api操作elasticsearch

简介 使用Java api操作elasticsearch 创建maven项目 pom.xml文件 <?xml version"1.0" encoding"UTF-8"?><project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi…

通过率100%!讯方技术河南经贸职业学院华为云计算HCIE订单班取得阶段性成果!

近日&#xff0c;由讯方技术与河南经贸职业学院计算机工程学院联合打造的华为云计算HCIE订单班传来喜讯。在该订单班中&#xff0c;首批参与HCIE实验考试的9名学生凭借扎实的专业知识和优秀的技能水平&#xff0c;全员顺利通过实验考试&#xff0c;通过率达到100%&#xff0c;体…

yolov8 剪枝

yolov8n 初始&#xff1a; YOLOv8n summary (fused): 185 layers, 3151904 parameters, 31936 gradients, 8.7 GFLOPs

正信晟锦:怎么追回欠债多年的钱

在这个世界上&#xff0c;最轻松的或许就是借钱时的许诺&#xff0c;而最难的&#xff0c;莫过于债务回收时的争取。尤其是在牵涉到追回那些欠债多年的旧账时&#xff0c;我们似乎总能更深地体会到“时间是把杀猪刀”的无奈。如何巧妙地追回这些遥不可及的欠款?这既是一场策略…

CSP - S 2024 模拟赛6补题报告

C S P − S 2024 模拟赛 6 补题报告 2024 年 8 月 5 日 − 2023 年 8 月 5 日 b y 邓时飏 CSP \ - \ S \ \ 2024 \ \ 模拟赛6 \ \ 补题报告 \\ 2024年8月5日 - 2023年8月5日 \\ by \ \ \ 邓时飏 CSP − S 2024 模拟赛6 补题报告2024年8月5日−2023年8月5日by 邓时飏 一、…

zotero安装与使用

文献管理工具&#xff09; Zotero软件官网https://www.zotero.org/download&#xff0c;不修改安装位置&#xff0c;默认安装就行&#xff1b;安装完成官网直接邮箱注册一个账号&#xff0c;软件登陆账号:编辑-首选项-同步 修改论文保存位置&#xff0c;有从其它电脑拷贝过来的…

强力巨彩又上新了!室内LED全彩显示屏尽“显”新体验

随着显示技术的进步和万物互联时代的到来&#xff0c;LED全彩显示屏在广告传媒、体育场馆、交通诱导、舞台演出等领域的应用持续扩大。强力巨彩更新迭代&#xff0c;室内LED全彩显示屏再次上新&#xff0c;其融合前沿GOB镀膜工艺&#xff0c;在防护性、成像质量、互动体验及设计…

视频美颜SDK与直播美颜插件在实时视频中的应用

视频美颜技术作为提升视频质量的重要手段&#xff0c;已经成为了许多视频和直播应用中不可或缺的一部分。本篇文章&#xff0c;笔者将探讨视频美颜SDK与直播美颜插件在实时视频中的应用&#xff0c;并分析其在用户体验和技术实现方面的重要性。 一、视频美颜SDK的应用场景 视…

el-tree懒加载状态下实现搜索筛选(纯前端)

1.效果图 &#xff08;1&#xff09;初始状态 &#xff08;2&#xff09;筛选后 2.代码 <template><div><el-inputplaceholder"输入关键字进行过滤"v-model"filterText"input"searchValue"></el-input><el-tree…

AI人工智能 时间序列数据介绍

AI人工智能 时间序列数据介绍 预测给定输入序列中的下一个是机器学习中的另一个重要概念。 本章为您提供有关分析时间序列数据的详细说明。 时间序列数据介绍 时间序列数据表示处于一系列特定时间间隔的数据。 如果我们想在机器学习中构建序列预测&#xff0c;那么必须处理连续…

DDei在线设计器-加载数据

加载数据 本示例演示了怎样加载已有的JSON到设计器中。 如需了解详细的API教程以及参数说明&#xff0c;请参考DDei文档 外部数据JSON demo.vue <script setup lang"ts"> import DDeiEditorView from "ddei-editor"; import { DDeiCoreStandLayou…

魔塔社区程序的`datasets.utils`导入`_datasets_server`错误问题的解决办法

运行魔塔社区的的一个识别图像文件中文字的模型程序&#xff1a; 出现如下的错误提示&#xff1a; from datasets.utils import _datasets_server,file_utils ImportError: cannot import name _datasets_server from datasets.utils (D:\PycharmProjects\minicpm_cuda_test\ve…

C语言指针详解(三)目录版

C语言指针详解&#xff08;三&#xff09;目录版 1、字符指针变量1.1、字符指针变量的一般应用1.2、常量字符串1.3、常量字符串与普通字符串的区别1.3.1 常量字符串的不可修改性1.3.2 常量字符串的存储 2、数组指针变量2.1、数组指针变量定义2.2、数组指针变量的初始化 3、二维…