生成Python Protocol Buffers类遇导入问题:Git子模块场景问询
Protobuf生成文件的结构调整与复用方案
一、调整结构让其他仓库能访问生成的类
1. 把子模块做成可安装的Python包
在子模块根目录创建pyproject.toml,明确声明要包含.pyi文件,示例配置如下:
[build-system] requires = ["setuptools>=61.0"] build-backend = "setuptools.build_meta" [project] name = "你的子模块名称" version = "0.1.0" packages = ["你的proto生成文件所在包名"] package-data = { "你的proto生成文件所在包名" = ["*.pyi"] }
其他仓库直接通过pip install 子模块本地路径安装后,.pyi文件会被正确纳入依赖,就能正常导入生成的类。
2. 统一生成目录并配置文件包含规则
- 固定生成文件的输出目录,比如子模块下的
src/你的proto模块,然后在子模块中添加MANIFEST.in文件:
include src/你的proto模块/*.py include src/你的proto模块/*.pyi
- 检查子模块的
.gitignore,不要把.pyi文件排除在外,将生成的.py和.pyi都提交到子模块的Git仓库中,这样其他仓库拉取子模块时就能直接获取这些文件。
3. 直接提交生成文件到子模块仓库
如果不想做Python包,最直接的方式就是把.py和.pyi都提交到子模块的Git仓库,确保.gitignore没有屏蔽这些文件。其他仓库拉取子模块后,就能直接从子模块目录导入类。
二、更新子模块/切换虚拟环境要不要重新生成
1. 更新子模块时
- 如果子模块里的
.proto文件没有变更,不需要重新生成; - 如果
.proto文件有更新,必须重新生成对应的.py和.pyi文件,并且提交到子模块仓库,其他仓库拉取更新后的子模块就能直接使用新的类。
2. 切换虚拟环境时
完全不需要重新生成。只要子模块已经安装到新虚拟环境(或者生成文件已经存在于子模块目录),重新安装子模块的依赖即可,生成的文件是静态的,和虚拟环境无关。
小技巧:写个一键生成脚本
在子模块里放个generate_proto.sh脚本,方便修改.proto后快速生成文件:
#!/bin/bash SRC_DIR="./proto" # 你的.proto文件所在目录 DST_DIR="./src/你的proto模块" # 生成文件输出目录 protoc -I=$SRC_DIR --python_out=$DST_DIR --pyi_out=$DST_DIR $SRC_DIR/addressbook.proto
改完.proto跑一下脚本就能完成更新。
内容的提问来源于stack exchange,提问作者Sarah
相关产品推荐
相关产品推荐

