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.rhkb.cn/news/472889.html

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

相关文章

营销手段的变革:开源 AI 智能名片与 S2B2C 商城小程序在新趋势下的机遇与挑战

摘要:本文探讨了在当今营销环境变化下,企业必须改变传统营销手段的必要性。分析了大环境造就的主流趋势对企业的要求,以及传统营销方式如邮件直投的局限性。着重阐述了移动营销的重要性,并进一步研究开源 AI 智能名片和 S2B2C 商城…

【SpringBoot】公共字段自动填充

问题引入 JavaEE开发的时候,新增字段,修改字段大都会涉及到创建时间(createTime),更改时间(updateTime),创建人(craeteUser),更改人(updateUser),如果每次都要自己去setter(),会比较麻烦&#…

网络安全练习之 ctfshow_web

文章目录 VIP题目限免(即:信息泄露题)源码泄露前台JS绕过协议头信息泄露robots后台泄露phps源码泄露源码压缩包泄露版本控制泄露源码(git)版本控制泄露源码2(svn)vim临时文件泄露cookie泄露域名txt记录泄露敏感信息公布内部技术文档泄露编辑器…

Git_2024/11/16

文章目录 前言Git是什么核心概念工作流程常见术语解读Git的优势 Git与SVN对比SVNGit总结 Git配置流程及指令环境配置获取Git仓库本地初始化远程克隆 工作目录、暂存区、版本库文件的两种状态本地仓库操作远程仓库操作Git分支Git标签IntelliJ IDEA使用Git回滚代码 GitHub配置流程…

游戏引擎学习第八天

视频参考: https://www.bilibili.com/video/BV1ouUPYAErK/ 理解下面的代码 关于虚函数 代码分解 结构体 foo 的定义: struct foo {int32 X;int64 Y;virtual void Bar(int c); };foo 结构体有两个成员变量:X(int32 类型)和 Y&…

蓝桥杯-洛谷刷题-day3(C++)

目录 1.忽略回车的字符串输入 i.getline() ii.逐个字符的识别再输入 2.获取绝对值abs() 3.做题时的误区 4.多个变量的某一个到达判断条件 i.max() 5.[NOIP2016 提高组] 玩具谜题 i.代码 6.逻辑上的圆圈 i.有限个数n的数组 7.数组的定义 i.动态数组 1.忽略回车的字符串输…

不用来回切换,一个界面管理多个微信

你是不是也有多个微信号需要管理? 是不是也觉得频繁切换账号很麻烦? 是不是也想提升多账号管理的效率? 在工作中,好的辅助工具,能让我们的效率加倍增长! 今天, 就给大家分享一个多微管理工具…

Word_小问题解决_1

1.第二页是空白的,但是删不掉 将鼠标弄到第二页最开始的地方打开段落设置行距为固定值0.7磅 2.表格中有文字进入了表格中怎么办 打开段落,将缩进改为0即可

LLM - 计算 多模态大语言模型 的参数量(Qwen2-VL、Llama-3.1) 教程

欢迎关注我的CSDN:https://spike.blog.csdn.net/ 本文地址:https://spike.blog.csdn.net/article/details/143749468 免责声明:本文来源于个人知识与公开资料,仅用于学术交流,欢迎讨论,不支持转载。 影响 (…

GEE下载ERA5-Land气象数据(1950-至今,降水、温度)

GEE下载ERA5-Land气象数据(1950-至今,降水、温度) ERA5-Land是一个高分辨率的陆地再分析数据集,相比ERA5数据集具有更高的空间分辨率。它是通过重新运行ECMWF ERA5气候再分析系统的陆地分量生成的。 空间分辨率特点: 网格间距…

动态规划-完全背包问题——518.零钱兑换II

1.题目解析 建议先看 322.零钱兑换可以 更加轻松的理解本题 题目来源 518.零钱兑换——力扣 测试用例 2.算法原理 1.状态表示 本题要求返回所有情况,所以dp值就代表所有的方法数,即 dp[i][j]:在[1,i]个硬币中选择不同面值的硬币&#xff0c…

推荐15个2024最新精选wordpress模板

以下是推荐的15个2024年最新精选WordPress模板,轻量级且SEO优化良好,适合需要高性能网站的用户。中文wordpress模板适合搭建企业官网使用。英文wordpress模板,适合B2C网站搭建,功能强大且兼容性好,是许多专业外贸网站的…

使用Java绘制图片边框,解决微信小程序map组件中marker与label层级关系问题,label增加外边框后显示不能置与marker上面

今天上线的时候发现系统不同显示好像不一样,苹果手机打开的时候是正常的,但是一旦用安卓手机打开就会出现label不置顶的情况。尝试了很多种办法,也在官方查看了map相关的文档,发现并没有给label设置zIndex的属性,只看到…

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

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

【HAProxy09】企业级反向代理HAProxy高级功能之压缩功能与后端服务器健康性监测

HAProxy 高级功能 介绍 HAProxy 高级配置及实用案例 压缩功能 对响应给客户端的报文进行压缩,以节省网络带宽,但是会占用部分CPU性能 建议在后端服务器开启压缩功能,而非在HAProxy上开启压缩 注意:默认Ubuntu的包安装nginx开…

zabbix7.0实操指南:基于麒麟V10操作系统部署zabbix7.0

在当今信息技术飞速发展的时代,企业对于IT基础设施的监控管理需求日益增长。为了确保系统的稳定性和高效性,我们需要一个强大的监控工具来实时监控各种硬件和软件资源的状态。Zabbix作为一个开源的企业级监控解决方案,因其强大的功能和灵活的…

Android笔记(三十七):封装一个RecyclerView Item曝光工具——用于埋点上报

背景 项目中首页列表页需要统计每个item的曝光情况,给产品运营提供数据报表分析用户行为,于是封装了一个通用的列表Item曝光工具,方便曝光埋点上报 源码分析 核心就是监听RecyclerView的滚动,在滚动状态为SCROLL_STATE_IDLE的时…

微服务瞎写

1.微服务解决的问题 1、如何发现新节点以及检查各节点的运行状态? 2、如何发现服务及负载均衡如何实现? 3、服务间如何进行消息通信? 4、如何对使用者暴露服务API? 5、如何集中管理各节点配置文件? 6、如何收集各…

群控系统服务端开发模式-应用开发-前端图片格式功能开发

一、添加视图 在根目录下src文件夹下views文件夹下param文件夹下grade文件夹下&#xff0c;新建index.vue&#xff0c;代码如下 <template><div class"app-container"><div class"filter-container" style"float:left;"><…

创建vue+electron项目流程

一个vue3和electron最基本的环境搭建步骤如下&#xff1a;// 安装 vite vue3 vite-plugin-vue-setup-extend less normalize.css mitt pinia vue-router npm create vuelatest npm i vite-plugin-vue-setup-extend -D npm i less -D npm i normalize.css -S &#xff0…