Python 打包教程:从零开始构建可分发的Python包

Python 打包教程:从零开始构建可分发的Python包

引言

在Python开发中,打包是一个重要的环节。无论是共享代码、发布库还是部署应用,创建一个可分发的Python包都是必不可少的步骤。本文将详细介绍如何打包Python项目,涵盖从基础知识到高级技巧的所有内容,让你能够轻松构建和发布自己的Python包。

为什么要打包?

通过打包,开发者可以将代码、资源和依赖项整合成一个可分发的单元。打包的好处包括:

  • 易于分发:可以通过PyPI等平台分享给其他开发者。
  • 版本管理:便于管理和更新代码版本。
  • 依赖管理:自动处理项目依赖,减少手动配置的麻烦。

准备工作

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

  • Python 3.x
  • setuptoolswheel

可以使用pip安装这两个库:

pip install setuptools wheel

创建一个简单的Python包

1. 项目结构

首先,创建一个新的项目文件夹,并在其中创建一个简单的Python包。以下是一个示例项目结构:

my_package/
│
├── my_package/
│   ├── __init__.py
│   └── hello.py
│
├── setup.py
└── README.md
  • my_package/:主包目录。
  • __init__.py:标识该目录为Python包。
  • hello.py:包含实际代码的模块。
  • setup.py:打包配置文件。
  • README.md:项目说明文件。

2. 编写代码

hello.py中写入以下代码:

def say_hello(name):return f"Hello, {name}!"

__init__.py中导入该函数:

from .hello import say_hello

3. 创建setup.py

setup.py是打包的核心配置文件,包含包的元数据和依赖项。以下是一个简单的setup.py示例:

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

4. 编写README.md

README.md中添加项目的基本信息和使用示例:

# My PackageA simple greeting package.## Installation```bash
pip install my_package

Usage

from my_package import say_helloprint(say_hello("World"))  # Output: Hello, World!

## 打包项目### 1. 生成分发包在项目根目录下运行以下命令生成分发包:```bash
python setup.py sdist bdist_wheel
  • sdist:生成源代码包。
  • bdist_wheel:生成二进制包。

运行后,你将在dist/目录下看到生成的.tar.gz.whl文件。

2. 安装打包后的包

可以使用pip安装本地生成的包:

pip install dist/my_package-0.1.0-py3-none-any.whl

发布到PyPI

1. 创建PyPI账户

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

2. 安装Twine

使用Twine工具将包上传到PyPI:

pip install twine

3. 上传包

使用以下命令上传包到PyPI:

twine upload dist/*

输入你的PyPI用户名和密码后,包将被上传。

高级打包技巧

1. 添加依赖项

setup.py中,可以通过install_requires参数指定项目依赖项。例如:

install_requires=["requests>=2.25.1",
],

2. 包含额外文件

如果需要将额外的文件(如数据文件、配置文件等)包含在包中,可以使用MANIFEST.in文件。例如:

include README.md

3. 自定义命令

可以通过自定义setuptools.Command类来添加自定义命令。例如,创建一个命令来运行测试:

from setuptools import Commandclass TestCommand(Command):description = "Run tests"user_options = []def initialize_options(self):passdef finalize_options(self):passdef run(self):# 运行测试的代码print("Running tests...")setup(...cmdclass={'test': TestCommand,},
)

示例项目

为了更好地理解Python打包的过程,我们可以创建一个示例项目,命名为math_operations,实现一些简单的数学运算。

项目结构

math_operations/
│
├── math_operations/
│   ├── __init__.py
│   └── operations.py
│
├── setup.py
└── README.md

编写代码

operations.py中实现简单的加法和减法:

def add(x, y):return x + ydef subtract(x, y):return x - y

__init__.py中导入这些函数:

from .operations import add, subtract

创建setup.py

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

编写README.md

# Math OperationsA simple math operations package.## Installation```bash
pip install math_operations

Usage

from math_operations import add, subtractprint(add(5, 3))       # Output: 8
print(subtract(5, 3))  # Output: 2

打包和发布

按照前面提到的步骤,生成分发包并上传到PyPI。

总结

通过本文的学习,你已经掌握了如何创建、打包和发布Python包的全过程。无论是简单的工具库还是复杂的应用程序,打包都是一个必不可少的步骤。希望这篇文章能够帮助你在Python开发的道路上走得更远!
如果你有任何问题或建议,欢迎在评论区留言!同时,不要忘记关注我的CSDN博客,获取更多Python开发的实用技巧和教程!

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

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

相关文章

大模型基础BERT——Transformers的双向编码器表示

大模型基础BERT——Transformers的双向编码器表示 整体概况 BERT:用于语言理解的深度双向Transform的预训练 论文题目:BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding Bidirectional Encoder Representations from…

Python教程笔记(2)

Python教程 5.1 列表详解5.1.3 列表推导式5.1.4 嵌套的列表推导式 5.7 深入条件控制6.1 模块详解6.3 dir()7.1 格式化字符串字面值7.1.3 手动格式化字符串 7.2 读写文件 5.1 列表详解 Python 中所有可变数据结构返回值为None。实现队列最好用 collections.deque。 5.1.3 列表…

DAHL:利用由跨越 29 个类别的 8,573 个问题组成的基准数据集,评估大型语言模型在生物医学领域长篇回答的事实准确性。

2024-11-14,由首尔国立大学创建的DAHL数据集,为评估大型语言模型(LLMs)在生物医学领域长文本生成中的幻觉问题提供了一个重要的工具,这对于提高模型的准确性和可靠性具有重要意义。 数据集地址:DAHL|生物医…

GStreamer 简明教程(九):Seek 与跳帧

系列文章目录 GStreamer 简明教程(一):环境搭建,运行 Basic Tutorial 1 Hello world! GStreamer 简明教程(二):基本概念介绍,Element 和 Pipeline GStreamer 简明教程(三…

【微软:多模态基础模型】(1)从专家到通用助手

欢迎关注【youcans的AGI学习笔记】原创作品 【微软:多模态基础模型】(1)从专家到通用助手 【微软:多模态基础模型】(2)视觉理解 【微软:多模态基础模型】(3)视觉生成 【微…

GRE做题笔记(零散的个人经验)

locomotive机车By 1813, the Luddite resistance had all but vanished. all but表示“几乎完全”的程度,或者表示排除piston活塞attributed to 归因于how a sportsperson accounted for their own experience of stress 运动员如何解释自己的压力经历 ,…

【蓝桥杯算法】Java的基础API

1. BigInteger 的使用 1.1. 判素数 package 模板;import java.math.BigInteger; import java.util.Scanner;public class 判素数 {static Scanner in new Scanner(System.in);public static void main(String[] args) {int q in.nextInt();while (q-- > 0) {BigInteger …

【项目实战】基于 LLaMA-Factory 通过 LoRA 微调 Qwen2

【项目实战】基于 LLaMAFactory 通过 LoRA 微调 Qwen2 一、项目介绍二、环境准备1、环境准备2、安装LLaMa-Factory3、准备模型数据集3.1 模型准备3.2 数据集准备 三、微调1、启动webui2、选择参数3、训练 四、测试五、总结 一、项目介绍 LLaMA-Factory是一个由北京航空航天大学…

数据仓库在大数据处理中的作用

数据仓库(Data Warehouse,简称DW或DWH)是一个面向主题的、集成的、相对稳定的、反映历史变化的数据集合,用于支持管理决策。以下是对数据仓库及其在大数据处理中作用的详细解释: 一、数据仓库的定义 面向主题&#x…

第23课-C++-红黑树的插入与旋转

🌇前言 红黑树是一种自平衡的二叉搜索树,因其出色的性能,广泛应用于实际中。Linux 内核中的 CFS 调度器便是一个使用红黑树的例子,这足以说明它的重要性。红黑树的实现通过红黑两种颜色的控制来维持平衡,并在必要时使…

基于 CentOS7.6 的 Docker 下载常用的容器(MySQLRedisMongoDB),解决拉取容器镜像失败问题

安装MySQL&Redis&MongoDB mysql选择是8版本,redis是选择4版本、mongoDB选择最新版,也可以根据自己的需要进行下载对应的版本,无非就是容器名:版本号 这样去拉去相关的容器镜像。如果你还不会在服务器中安装 docker,可以查…

C#/WinForm拖拽文件上传

一、首先创建一个上传文件的类,继承Control类,如下: public class UploadControl : Control{private Image _image;public UploadControl(){this.SetStyle(ControlStyles.UserPaint | //控件自行绘制,而不使用操作系统的绘制Cont…

ubuntu将firewall-config导出为.deb文件

firewall-config ubuntu是canonial 公司维护的,用wireshark测过,开机会给他们公司发遥测(开了ufw阻塞所有连接也一样,canonial在里面把代码改了)firewall-config是fedora(爱好者维护,公益版本)自带的防火墙…

蓝桥杯备考——算法

一、排序 冒泡排序、选择排序、插入排序、 快速排序、归并排序、桶排序 二、枚举 三、二分查找与二分答案 四、搜索(DFS) DFS(DFS基础、回溯、剪枝、记忆化) 1.DFS算法(深度优先搜索算法) 深度优先搜…

Javascript垃圾回收机制-运行机制(大厂内部培训版本)

前言 计算机基本组成: 我们编写的软件首先读取到内存,用于提供给 CPU 进行运算处理。 内存的读取和释放,决定了程序性能。 冯诺依曼结构 解释和编译 这两个概念怎么理解呢。 编译相当于事先已经完成了可以直接用。好比去饭店吃饭点完上…

python面向对象基础入门

面向对象 基本的实现方法大概如此 class Student(object):def __init__(self, name, score):self.name nameself.score scoredef print_score(self):print(%s: %s % (self.name, self.score))在面向对象的思想中,面对一个问题,首先应该考虑这个问题所…

阿里云ACK容器如何配置pod分散在集群的不同节点上

阿里云ACK容器如何配置pod分散在集群的不同节点上 1.核心原理 是使用pod间反亲和性(podAntiAffinity),pod间反亲和性又分为软约束反亲和和硬约束反亲和。 2.软约束反亲和和硬约束反亲和区别: preferredDuringSchedulingIgnore…

ffmpeg+D3D实现的MFC音视频播放器,支持录像、截图、音视频播放、码流信息显示等功能

一、简介 本播放器是在vs2019 x86下开发,通过ffmpeg实现拉流解码功能,通过D3D实现视频的渲染功能。截图功能采用libjpeg实现,可以截取jpg图片,图片的默认保存路径是在C:\MYRecPath中。录像功能采用封装好的类Mp4Record实现&#x…

怎样遵守编程规范,减少和控制C++编程中出现的bug?

遵守编程规范和最佳实践是减少和控制 C 编程中出现 bug 的重要手段。以下是一些具体的建议和策略,帮助你编写更健壮、更易于维护的 C 代码。 1. 遵循 C 标准和最佳实践 使用现代 C 特性:尽可能使用 C11 及之后的标准,避免使用过时的特性和库…

从零开始学习 sg200x 多核开发之 uboot 网络功能使能

sophpi u-boot 默认未开启网络功能,需要手动开启,为了在 u-boot 下可以通过 tftp 下载固件,先测试 u-boot 下网络功能。 u-boot 网络功能开启 在 build/boards/cv181x/sg2002_wevb_riscv64_sd/u-boot/cvitek_sg2002_wevb_riscv64_sd_defcon…