如何在将java项目中的proto文件编译为python模块时避免嵌套导入



例如,在java项目中

myapp
└── src
└── main
└── proto
└── com
└── abc
└── myapp
└── api
├── common.proto
└── myapp.proto
$ cat myapp/src/main/proto/com/abc/myapp/api/common.proto
syntax = "proto3";
package com.abc.myapp.api;
message Metadata {
string key = 1;
}
$ cat myapp/src/main/proto/com/abc/myapp/api/myapp.proto
syntax = "proto3";
import "com/abc/myapp/api/common.proto";
package com.abc.myapp.api;
message Request {
string name = 1;
Metadata metada = 2;
}

在将protos编译为python模块时

$ protoc -I myapp/src/main/proto --python_out=tmp  com/abc/myapp/api/common.proto 
$ protoc -I myapp/src/main/proto --python_out=tmp  com/abc/myapp/api/myapp.proto

输出结构类似

tmp
└── com
└── abc
└── myapp
└── api
├── common_pb2.py
└── myapp_pb2.py

myapp_pb2.py内部,导入是嵌套的,就像一样

from com.abc.myapp.api import common_pb2 as com_dot_abc_dot_myapp_dot_api_dot_common__pb2

有没有推荐的做法可以使编译后的pb2文件在结构上扁平化?例如

tmp
├── common_pb2.py
└── myapp_pb2.py

CCD_ 2具有类似的导入功能

from . import common_pb2 as ...

而不是

from com.abc.myapp.api import common_pb2 com.abc.myapp.api ...

您可以使用protobufs在目录中创建一个init文件,然后添加以下代码:

# pb/__init__.py
import sys
from pathlib import Path
sys.path.append(str(Path(__file__).parent))

这应该允许您以所需的方式导入文件。

请注意,您所要求的不是当前可用的功能,我提出的解决方案只是正在使用的众多解决方案之一。

对于许多protobuf的python用户来说,这是一个已知的刺激源,请参阅:https://github.com/protocolbuffers/protobuf/pull/7470和https://github.com/protocolbuffers/protobuf/issues/1491

最新更新