当前位置: 首页 > 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.rkmt.cn/news/11523.html

相关文章:

  • 详细介绍:Python + Flask + API Gateway + Lambda + EKS 实战
  • 实用指南:【设计模式】适配器模式 在java中的应用
  • 达梦数据库查询字段类型为Date 修改为DateTime
  • 详细介绍:PyTorch 神经网络工具箱
  • C++ new 操作符在操作系统层执行了什么操作?
  • [ABC422F-G] 题解
  • c# Listdynamic 按字段排序
  • 双活、异地多活架构怎么设计才不翻车? - 教程
  • 制造业碳足迹追踪:开源能源管理系统如何助力企业实现“碳数据可视化”?
  • iframe安全盲区:支付信息窃取攻击的新温床 - 教程
  • 综合网表中有assign怎么办
  • 极限与导数
  • 深入解析:文献阅读 | iMetaMed | FigureYa:一个标准化可视化框架,用于增强生物医学数据解释和研究效率
  • 单独
  • 为什么应该测试无JavaScript的页面体验
  • 完整教程:UE5小游戏开发 - 武士决斗
  • PolarFire SOC Auto Update 和 IAP 文档阅读(三) AUTO UPDATE
  • 一款不错的PDF工具,吾爱出品 - 教程
  • 完整教程:科技的温情——挽救鼠鼠/兔兔的生命
  • 关闭Cadence Allegro Design Entry CIS(OrCAD Capture)的Start Page
  • K8S APIServer压力高,导致控制器Leader续约失败而重启问题
  • 8K 视频修复提速 50%!Topaz Video AI 7.0.0 实战指南:AI 增强 + 本地化模型 + GPU 加速全解析
  • vivo 浏览器福利体系架构演进之路
  • 2024JCR最新完整版期刊名单!【附带21-23年完整版表格】
  • python 数组的赋值和copy 和deepcopy
  • 深入解析:SQL server 2022下载安装详细教程
  • 详细介绍:npm玩转技巧
  • 软件构造的基本原理 1章
  • 【2025-09-23】性格问题
  • Gitee DevOps:国产研发效能平台的破局之道