Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to avoid placing _pb2.py files at package root?

I'm using libprotoc 3.2.0 with Python 3 in a Python package. If I try to the Protobuff Python files (denoted with the extensions _pb2.py) in to their own folder, with the .proto files, let's say protobufs and then try to import them a python file as follows:

# assuming outputs from a.proto and b.proto, where b depends on a
import protobufs.a
import protobufs.b

I get import errors that b can't find a. If I output the _pb2.py files into the root of my package, I don't have this problem. This is elaborated upon in this issue, but I'm not sure if I'm having the exact same issue or not. Is is possible to avoid outputting the _pb2.py files at the root of my package?

Non-Toy Example

What I actually have is two protobuffs that reference each-other, as follows in the .proto file:

syntax = "proto3";
import "common.proto";

In the Python file, this is translated to:

# 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

But because the file is in a folder called protobufs in a Python package, the last line should be import protobufs.common_pb2 as common__pb2 and not import common_pb2 as common__pb2, but libprotoc doesn't know how to take the folder into account.

like image 391
Seanny123 Avatar asked Oct 18 '22 16:10

Seanny123


1 Answers

The solution is actually quite straightforward. Simply use:

import "protobufs/common.proto";

This should cause your _pb2.py file to contain the import from protobufs import common_pb2 as protobufs_dot_common__pb2 instead of the current import.

Of course, you'll need to update your compiler's command line accordingly. Something in the line of:

protoc.exe protobufs\persons.proto --proto_path=. --python_out=.
like image 139
Hetzroni Avatar answered Oct 21 '22 04:10

Hetzroni