工程实践 使用本地包开发python项目

news/2025/9/25 13:45:57/文章来源:https://www.cnblogs.com/JiangOil/p/19111044

工程实践 使用本地包开发python项目

当python项目比较庞大, 把共用的公共函数和方法封装成一个本地包不仅便于在不同项目间复用,还能通过统一的方式读取资源文件, 是一个很好的工程实践. 下面来介绍一下这种开发方式.

我们需要把公共部分代码以一个python包的规范进行开发, 再以 edit 模式安装在本地python包的目录中. 就可以在不同的子项目中直接用import引用公共的库和方法, 公共库有更新时, 各个子项目也可以无痛的进行更新. 免去了处理相关路径, 等各种麻烦事.

公共模块的结构:

myproject/
├── mypackage/          # 包目录(必须有 __init__.py)
│   ├── __init__.py     # 包初始化文件
|   ├── resources/      # 资源文件夹
|   │   └── context.txt
│   ├── module1.py      # 模块文件
│   └── submodule/      # 子包
│       ├── __init__.py
│       └── module2.py
├── tests/              # 测试目录(可选)
│   └── test_module1.py
├── pyproject.toml      # 现代配置文件(推荐,Python 3.7+)
├── setup.py            # 传统配置文件(可选,如果无 pyproject.toml)
├── README.md           # 文档
└── LICENSE             # 许可证

myproject 是项目根目录,其中的 mypackage 是你定义的 Python 包名称。pyproject.toml 是包的配置文件 (旧版的规范是用setup.py)
一个demo pyproject.toml 是这样的:

[build-system]
requires = ["setuptools>=61.0", "wheel"]
build-backend = "setuptools.build_meta"[project]
name = "mypackage"
version = "0.1.0"
description = "My development package juset a demo pkg"
authors = [{name = "UnKnown", email = "unknown@email.com"}]
dependencies = []  # 依赖列表[tool.setuptools.package-data]
mypackage = ["resources/*","resources/**/*"]  # 包含资源文件

当我们把公共代码写好后, 用 pip install -e .的方式进行edit模式的安装. 之后在各个项目目中引用就是 from mypackage import xxx. 我们也可以用统一的路径来引用公共包中的资源文件, 所用的引用方式是借助 importlib 库中的 files方法. 比如你的包名是 mypackage , 有个context.txt 放在了 resources目录下, 引用文件路径就这样写: files("mypackage.resources").joinpath("context.txt")

from mypackage import sayHi
sayHi()from importlib.resources import files
print(files("mypackage.resources").joinpath("context.txt").read_text())

在mypackage内部, 各模块之间的import要使用相对引用, 如 from .module1 import func 这是Python所推荐的开发规范. 可在规避不同环境下的迁移问题.

当需要生产部署时, 我们可以用 python -m build 来编译生成wheel包. 把打包好的 wheel 在生产环境里安装.

更多内容:
https://www.codebonobo.tech/post/40#工程实践 使用本地包开发python项目

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

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

相关文章

详细介绍:Python + Flask + API Gateway + Lambda + EKS 实战

详细介绍:Python + Flask + API Gateway + Lambda + EKS 实战pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Con…

实用指南:【设计模式】适配器模式 在java中的应用

实用指南:【设计模式】适配器模式 在java中的应用2025-09-25 13:45 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; displ…

日记4

今天接着学Java,直接从类和对象入手。理解类是模板,对象是实例,像设计图纸和盖好的房子。试着写简单类定义对象,一开始老把属性和方法弄混,改了几次代码,终于成功创建对象并调用方法,感觉对面向对象的思路更清晰…

P2042 [NOI2005] 维护数列 题解

QwQP2042 [NOI2005] 维护数列 题解 平衡树 因为操作里面有翻转,严格强于文艺平衡树,所以考虑平衡树维护数列。直接暴力插入即可 分裂出删除的子段,然后合并其两端的平衡树 分裂出修改的子段,然后打推平的懒标记, …

达梦数据库查询字段类型为Date 修改为DateTime

SELECT ALTER TABLE || OWNER || . || TABLE_NAME || MODIFY || COLUMN_NAME || DATETIME; AS alter_sql FROM ALL_TAB_COLUMNS WHERE DATA_TYPE = DATE and OWNER=PS_EXAMPLEDBUSER order by COLUMN_NAME asc

详细介绍:PyTorch 神经网络工具箱

详细介绍:PyTorch 神经网络工具箱pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco&…

C++ new 操作符在操作系统层执行了什么操作?

C++ new 操作符在操作系统层执行了什么操作?在C++中,new操作符的执行涉及操作系统层面的内存分配和对象构造过程,具体可分为以下几个关键步骤: 1. 调用内存分配函数(operator new) new操作符首先通过operator ne…

[ABC422F-G] 题解

QwQ[ABC422F-G] 题解 F - Eat and Ride 考虑 DP,DP 状态要么压和要么压长度,如果压和就很直接,但是显然复杂度会爆炸,如果压长度的话,可以发现每到一个新点都要算:这条路径中在它后面的点的个数乘上它的点权,所…

天津模板建站代理wordpress增加赞赏

代码参考:《重学Java设计模式小傅哥》 目录1、静态类使用2、懒汉模式(线程不安全)3、懒汉模式(线程安全)4、饿汉模式(线程安全)5、使用类的内部类(线程安全)6、双重锁检验…

最新获取网站访客qq接口推客平台有哪些

传媒如春雨,润物细无声,大家好,我是51媒体网胡老师。 媒体邀约的好处主要体现在提高品牌知名度、扩大受众群体以及与媒体建立良好的合作关系。 媒体邀约是一种有效的公关策略,通过吸引媒体关注来促进信息的传播。它可以帮助组织…

山东省住房和城乡建设部网站首页四川润邦建设工程设计有限公司网站

大家好,我是阿赵。   这篇文章我想写了很久,是关于Unity项目使用AssetBundle加载资源时的内存管理的。这篇文章不会分享代码,只是分享思路,思路不一定正确,欢迎讨论。   对于Unity引擎的资源内存管理,我…

公司网站模板源代码常州微网站建设文档

如果有客户端1、客户端2等N个客户端争抢一个 Zookeeper 分布式锁。大致如下: 1: 大家都是上来直接创建一个锁节点下的一个接一个的临时有序节点 2: 如果自己不是第一个节点,就对自己上一个节点加监听器 3: 只要上一…

c# Listdynamic 按字段排序

public static List<dynamic> OrderByKey (this IList<dynamic> list, string propertyName, bool isDescending = false){var propertyInfo = list[0].GetType().GetProperty(propertyName);if (isDescen…

你看到的和你想要的

你看到的和你想要的 漫思

建设一个货代网站想要多少钱做谷歌网站使用什么统计代码

官方文档&#xff1a;入门指南 | Selenium Selenium是一个用于Web应用测试的工具。Selenium测试直接运行在浏览器中&#xff0c;就像真正的用户在操作一样。 所以使用这个前端测试话工具&#xff0c;可以自动化做很多事情&#xff0c;比如自动化抓取网页内容&#xff0c;俗称网…

大兴网站定制开发房地产招新人的坑

依赖倒转原则 在大话设计模式这本书中&#xff0c;作者通过电话修电脑这个例子引入了面向对象设计的基本原则之一&#xff1a;依赖倒转原则。 概念 依赖倒转原则是面向对象设计的基本原则之一&#xff0c;它用于减少类之间的耦合&#xff0c;提高系统的灵活性和可维护性。在…

东莞网站制作电话糗事百科 wordpress

文章目录1. 题目2. 解题1. 题目 给定一个字符串 s&#xff0c;将 s 分割成一些子串&#xff0c;使每个子串都是回文串。 返回符合要求的最少分割次数。 示例: 输入: "aab" 输出: 1 解释: 进行一次分割就可将 s 分割成 ["aa","b"] 这样两个回文…

济南网站建设公司 推荐行知科技自己做网站用什么app

前言 本文主要介绍Redis的三种持久化方式、AOF持久化策略等 什么是持久化 持久化是指将数据在内存中的状态保存到非易失性介质&#xff08;如硬盘、固态硬盘等&#xff09;上的过程。在计算机中&#xff0c;内存中的数据属于易失性数据&#xff0c;一旦断电或重启系统&#…

别再靠 “关设备” 减碳!EMS 的 “预测性控能”,让企业满产也能达标双碳

在 “双碳” 目标推进的当下,减碳已成为企业发展的必答题。然而,不少企业仍陷入 “减碳就减产” 的困境 —— 为了降低碳排放,不得不采取关停生产线、限制设备运行时长等简单粗暴的方式,结果导致订单交付延迟、产能…

双活、异地多活架构怎么设计才不翻车? - 教程

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …