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…

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

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

【微软:多模态基础模型】(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是一个由北京航空航天大学…

第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 进行运算处理。 内存的读取和释放,决定了程序性能。 冯诺依曼结构 解释和编译 这两个概念怎么理解呢。 编译相当于事先已经完成了可以直接用。好比去饭店吃饭点完上…

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

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

NodeJS 百度智能云文本转语音(实测)

现在文本转语音的技术已经非常完善了,尽管网络上有许多免费的工具,还是测试了专业的服务,选择了百度的TTS服务。 于是,在百度智能云注册和开通了文本转语音的服务,尝试使用NodeJS 实现文本转语音服务。但是百度的文档实…

信也科技和云杉网络的AI可观测性实践分享

1. 信也科技 2、云杉网络 2.1 中国移动

解析煤矿一张图

解析煤矿一张图 ​ 煤矿一张图是指通过数字化、智能化技术将煤矿的各项信息、数据和资源进行集中展示和管理,形成一个综合的可视化平台。这一平台将矿井的地理信息、设备状态、人员位置、安全生产、环境监测等信息整合成一个统一的“图形”,以便于管理者…

SpringBootTest常见错误解决

1.启动类所在包错误 问题 由于启动类所在包与需要自动注入的类的包不在一个包下: 启动类所在包: com.exmaple.test_02 但是对于需要注入的类却不在com.exmaple.test_02下或者其子包下,就会导致启动类无法扫描到该类,从而无法对…

Java 全栈知识体系

包含: Java 基础, Java 部分源码, JVM, Spring, Spring Boot, Spring Cloud, 数据库原理, MySQL, ElasticSearch, MongoDB, Docker, k8s, CI&CD, Linux, DevOps, 分布式, 中间件, 开发工具, Git, IDE, 源码阅读,读书笔记, 开源项目...

高效管理生产线:哪些项目管理工具最适合制造企业?

制造业的生产管理往往涉及复杂的流程和多部门协作,如何确保各环节顺利对接、信息准确传递,是每一家制造企业都在不断优化的问题。面对这些管理难题,越来越多的制造企业引入了项目管理软件,通过直观的任务分配、进度跟踪、数据反馈…

微信小程序 https://thirdwx.qlogo.cn 不在以下 downloadFile 合法域名列表中

授权登录后,拿到用户头像进行加载,但报错提示: https://thirdwx.qlogo.cn 不在以下 downloadFile 合法域名列表中 解决方法一(未完全解决,临时处理):在微信开发者工具将不校验...勾上就可以访问…