我在Python包中使用{3}}和Python 3。如果我尝试将Protobuff Python文件(用扩展名libprotoc 3.2.0
表示)放入他们自己的文件夹中,并使用_pb2.py
文件,请说.proto
,然后尝试导入他们是一个python文件如下:
protobufs
我收到# assuming outputs from a.proto and b.proto, where b depends on a
import protobufs.a
import protobufs.b
无法找到b
的导入错误。如果我将a
文件输出到我的软件包的根目录中,我就不会遇到此问题。这在this issue中有详细说明,但我不确定我是否有完全相同的问题。是否可以避免在我的包的根目录输出_pb2.py
文件?
我实际拥有的是两个引用彼此的protobuff,如下_pb2.py
文件中所示:
.proto
在Python文件中,这被翻译为:
syntax = "proto3";
import "common.proto";
但是因为该文件位于Python包中名为# Generated by the protocol buffer compiler. DO NOT EDIT!
# source: persons.proto
import sys
_b=sys.version_info[0]<3 and (lambda x:x) or (lambda x:x.encode('latin1'))
from google.protobuf.internal import enum_type_wrapper
from google.protobuf import descriptor as _descriptor
from google.protobuf import message as _message
from google.protobuf import reflection as _reflection
from google.protobuf import symbol_database as _symbol_database
from google.protobuf import descriptor_pb2
# @@protoc_insertion_point(imports)
_sym_db = _symbol_database.Default()
import common_pb2 as common__pb2
的文件夹中,所以最后一行应该是protobufs
而不是import protobufs.common_pb2 as common__pb2
,但是import common_pb2 as common__pb2
并不是libprotoc
。知道如何考虑文件夹。
答案 0 :(得分:3)
解决方案实际上非常简单。 只需使用:
import "protobufs/common.proto";
这会导致您的_pb2.py
文件包含导入from protobufs import common_pb2 as protobufs_dot_common__pb2
而不是当前导入。
当然,您需要相应地更新编译器的命令行。以下内容:
protoc.exe protobufs\persons.proto --proto_path=. --python_out=.