例如,在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