如何在多个Python项目间共享通用代码并实现自动更新?
多项目复用通用代码的最佳实践
针对你把通用代码拆分到独立项目维护、并在其他项目共享的需求,以下是几种成熟的实践方案,包含更新机制的说明:
一、将通用代码打包为本地可编辑安装的Python包
这是最常用的轻量方案,适合个人或小团队使用,修改通用代码后其他项目能实时生效。
操作步骤:
- 在
CommonProject目录下创建pyproject.toml文件(替代老旧的setup.py,是当前Python官方推荐的打包配置),示例内容:
[build-system] requires = ["setuptools>=61.0"] build-backend = "setuptools.build_meta" [project] name = "common-utils" version = "0.1.0" authors = [ { name="Your Name", email="your@email.com" } ] description = "通用工具函数包"
- 在Project1和Project2的虚拟环境中,执行本地可编辑安装命令:
pip install -e /path/to/CommonProject
- 之后在
Project1/main.py和Project2/main.py中直接导入:
from utilities import your_function
更新机制:
因为是可编辑安装,你对CommonProject/utilities.py的任何修改,都会立即同步到所有引用该包的项目中,无需重新安装。如果需要发布正式版本,只需修改pyproject.toml中的version字段,然后重新安装即可。
二、使用Git子模块管理通用代码
如果你的项目都用Git管理,子模块可以让每个项目独立控制通用代码的版本,适合需要版本隔离的场景。
操作步骤:
- 先把
CommonProject推送到独立的Git仓库。 - 在Project1的根目录执行命令,添加子模块:
git submodule add <CommonProject的Git仓库地址> common_utils
- 调整
Project1/main.py的导入路径,比如把common_utils目录加入Python路径:
import sys sys.path.append("./common_utils") from utilities import your_function
- 提交子模块关联到Project1的Git仓库,其他开发者拉取Project1时,需要执行:
git submodule init git submodule update
更新机制:
当CommonProject有更新时,在Project1的子模块目录中执行git pull拉取最新代码即可。如果需要固定某个版本,直接在子模块目录切换到对应提交,然后提交Project1的子模块版本变更。
三、搭建私有PyPI仓库分发通用包
适合中大型团队,能规范管理版本、权限,支持批量分发更新。
操作步骤:
- 搭建私有PyPI仓库(比如用
devpi或自建Warehouse服务)。 - 每次
CommonProject迭代后,打包并上传到私有仓库:
# 先构建包 python -m build # 上传到私有仓库(以devpi为例) devpi upload
- 在Project1和Project2的
requirements.txt中指定私有仓库地址和包版本:
--extra-index-url http://your-private-pypi-url/simple/ common-utils==0.1.0
- 执行
pip install -r requirements.txt安装。
更新机制:
当通用包有新版本时,修改requirements.txt中的版本号(或使用版本范围如>=0.1.0,<0.2.0),然后执行pip install --upgrade common-utils即可更新。不建议开启自动更新,以免引入不兼容变更,最好由开发者手动控制版本升级。
关于“自动更新”的说明
自动更新通用包存在较大风险(比如新代码引入Bug或不兼容变更),行业内一般不推荐。如果确实需要半自动化更新,可以在CI/CD流程中加入依赖检查步骤(比如用pip-audit或pip-check),定期提醒开发者升级版本,再手动确认更新。
内容的提问来源于stack exchange,提问作者Multiplexer
相关产品推荐
相关产品推荐

