例如在一个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
和 myapp_pb2.py
有进口from . import common_pb2 as ...
代替from com.abc.myapp.api import common_pb2 com.abc.myapp.api ...
最佳答案
您可以创建一个 初始化 使用您的 protobufs 在目录中文件,然后添加以下代码:
# 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
关于java - 将java项目中的proto文件编译成python模块时如何避免嵌套导入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63123779/