如何从其他Python包导入协议缓冲区定义?
我有这样的目录结构:
root/
sift/
__init__.py
sift_descriptors.proto
sift_descriptors_pb2.py
project/
__init__.py
filtered_descriptors.proto
filtered_descriptors_pb2.py
filtered_descriptors_test.py
根目录在我的 $PYTHONPATH
中。
我用 protoc --python_out=./ sift_descriptors.proto
命令生成了 root/sift/sift_descriptors_pb2.py
文件。
我用 /cs/public/lib/pkg/protobuf/bin/protoc --proto_path=../sift --proto_path=./ --python_out=./ filtered_descriptors.proto
命令生成了 root/project/filtered_descriptors_pb2.py
文件。
在 filtered_descriptors.proto
文件中,我使用了 import "sift_descriptors.proto"
。
问题是,在 filtered_descriptors_pb2.py
文件中(由 protoc 生成),有一行代码直接写了 import sift_descriptors_pb2
,而没有使用模块名的方式引用:from sift import sift_descriptors_pb2
。
我哪里做错了?
2 个回答
在导入语句中,你不需要加上 .py 后缀,比如说: "from sift import sift_descriptors_pb2"
我解决了这个问题!
解决办法是,在 filtered_descriptors.proto
文件中使用 import "sift/sift_descriptors.proto"
,然后把 protoc
指向 --proto_path=../
,而不是 --proto_path=../sift
。
这样,protoc 就会生成一段 Python 代码,里面的导入语句是 import sift.sift_descriptors_pb2
。