工程实践 使用本地包开发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项目