如何从其他Python包导入协议缓冲区定义?

0 投票
2 回答
2105 浏览
提问于 2025-04-16 06:07

我有这样的目录结构:

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 个回答

1

在导入语句中,你不需要加上 .py 后缀,比如说: "from sift import sift_descriptors_pb2"

1

我解决了这个问题!

解决办法是,在 filtered_descriptors.proto 文件中使用 import "sift/sift_descriptors.proto",然后把 protoc 指向 --proto_path=../,而不是 --proto_path=../sift

这样,protoc 就会生成一段 Python 代码,里面的导入语句是 import sift.sift_descriptors_pb2

撰写回答