当前位置: 首页 > news >正文

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

工程实践 使用本地包开发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.hskmm.com/?act=detail&tid=16892

相关文章:

  • 详细介绍:Python + Flask + API Gateway + Lambda + EKS 实战
  • 日记4
  • P2042 [NOI2005] 维护数列 题解
  • 达梦数据库查询字段类型为Date 修改为DateTime
  • C++ new 操作符在操作系统层执行了什么操作?
  • [ABC422F-G] 题解
  • 别再靠 “关设备” 减碳!EMS 的 “预测性控能”,让企业满产也能达标双碳
  • LAMP 架构说明及部署实践 - 教程
  • MyEMS 深度解析:核心功能模块、数据流转逻辑与工业能源优化落地路径
  • kettle插件-国产数据库金仓插件,助力国产数据库腾飞
  • 制造业碳足迹追踪:开源能源管理系统如何助力企业实现“碳数据可视化”?
  • iframe安全盲区:支付信息窃取攻击的新温床 - 教程
  • 综合网表中有assign怎么办
  • 极限与导数
  • 呼叫中心开源社区专栏第一篇 - 详解
  • 原核表达可溶性蛋白难题破解
  • 深入解析:Adobe Fresco下载教程Adobe Fresco 2025保姆级安装步骤(附安装包)
  • Torch中的tensor size
  • Codeforces 1053 (Div.2)
  • 抗体药物偶联物(ADCs)生物分析:拆解 “靶向导弹” 体内轨迹的核心技术
  • 详细介绍:微服务的适用边界:从金融科技到量子计算的架构哲学
  • 使用IOT-Tree整合复杂计算模型(含AI模型),并对接现场设备优化控制(节能提效)技能方案
  • 为什么应该测试无JavaScript的页面体验
  • 前台部分数据不显示
  • 指针定义以及二维数组内存地址(java/c++/python)
  • 解码数据结构线性表之顺序表
  • 中电金信:源启数据集成平台全新升级,实现便捷与性能双飞跃
  • Jupyter NoteBook / Jupyter Lab的安装与使用
  • 完整教程:科技的温情——挽救鼠鼠/兔兔的生命
  • 易基因:Nat Rev Drug Discov/IF101.8:何川团队顶刊综述RNA修饰系统作为疾病治疗靶点的研究进展