You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

生成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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 21:05:08