如何从另一个Python包导入protocol buffer定义?
我的目录结构如下:
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
我构建 root/project/filtered_descriptors_pb2.py
使用/cs/public/lib/pkg/protobuf/bin/protoc --proto_path=../sift --proto_path=./ --python_out=./filtered_descriptors.proto
在filtered_descriptors中 .proto,我使用 import "sift_descriptors.proto"
问题是,在 filtered_descriptors_pb2.py
(由 protoc 生成)中,有一条语句只执行此操作裸导入:import sift_descriptors_pb2
,不通过所需的模块名称进行引用:from sift import sift_descriptors_pb2
。
我做错了什么?
I have my directory structure like this:
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
The root directory is in my $PYTHONPATH
.
I build root/sift/sift_descriptors_pb2.py
using protoc --python_out=./ sift_descriptors.proto
I build root/project/filtered_descriptors_pb2.py
using /cs/public/lib/pkg/protobuf/bin/protoc --proto_path=../sift --proto_path=./ --python_out=./ filtered_descriptors.proto
In filtered_descriptors.proto
, I use import "sift_descriptors.proto"
The problem is that in filtered_descriptors_pb2.py
(produced by protoc), there's a statement that just does this bare import: import sift_descriptors_pb2
, without reference via the module name as would be needed: from sift import sift_descriptors_pb2
.
What am I doing wrong?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
您不将 .py 添加到导入语句:“from sift import sift_descriptors_pb2”
You don't add .py to the import statement: "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
的形式进行导入。I fixed it!
The solution was to use
import "sift/sift_descriptors.proto"
infiltered_descriptors.proto
, and then pointprotoc
to--proto_path=../
instead of--proto_path=../sift
.Then, protoc generates python code that does the import as
import sift.sift_descriptors_pb2
.