如何避免在包root上放置_pb2.py文件?

时间:2017-02-23 11:59:56

标签: python python-3.x protocol-buffers

我在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。知道如何考虑文件夹。

1 个答案:

答案 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=.