Python导入Protobuf编译文件失败:依赖文件未加载问题求助
ProtoBuf依赖描述符加载失败问题解决
目录结构
test |-test.py |-test.proto |-test_pb2.py |-__init__.py |-comm |-comm.proto |-comm_pb2.py |-__init__.py
两个__init__.py文件均为空。
Proto文件内容
test.proto
package test; import "comm/comm.proto"; message Test{ optional comm.Foo foo = 1; }
comm.proto
package comm; message Foo{}
编译操作
- 在
comm目录执行命令:protoc --python_out=. -I. comm.proto,编译成功 - 在
test目录执行命令:protoc --python_out=. -I. test.proto,编译成功
报错信息
在test.py中导入test_pb2时,出现错误:
TypeError: Couldn't build proto file into descriptor pool: Depends on file 'comm/comm.proto', but it has not been loaded
原因
编译生成的test_pb2.py依赖comm_pb2.py中的ProtoBuf描述符,但运行时加载test_pb2前,comm_pb2的描述符未被加载到描述符池中,导致依赖缺失。
解决方案
方法1:调整导入顺序(最快解决)
在test.py中先导入comm_pb2,再导入test_pb2:
from comm import comm_pb2 import test_pb2
方法2:统一编译命令(更规范)
不要分开在两个目录编译,直接在test目录下一次性编译两个proto文件,让protoc自动处理依赖关联:
# 进入test目录后执行 protoc --python_out=. -I. comm/comm.proto test.proto
重新编译后,运行时无需调整导入顺序即可正常加载。
方法3:修复Python导入路径
如果项目根目录不在Python的默认搜索路径中,先添加路径再导入:
import sys import os # 将当前test目录添加到sys.path sys.path.append(os.path.dirname(os.path.abspath(__file__))) from comm import comm_pb2 import test_pb2
内容的提问来源于stack exchange,提问作者charlie
相关产品推荐
相关产品推荐

