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

标签 java python protocol-buffers proto

例如在一个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/7470https://github.com/protocolbuffers/protobuf/issues/1491

关于java - 将java项目中的proto文件编译成python模块时如何避免嵌套导入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63123779/

相关文章:

c++ - 程序状态和调试器不一致

c# - 使用 FieldDescriptor 迭代未知的重复 protobuf 字段

c# - 在 protobuf-net 中序列化 Type 类?

java - 使用 OWL API 4.0.x 时出现 NoSuchMethodError

java - 在 switch case 中使用枚举的序号而不是使用枚举有什么重要的理由吗?

java - 项目构建错误: Non-resolvable parent POM cannot find repository

python - 当 pandas 总是显示 "No such file or directory"时,如何让 pandas 读取 CSV 文件?

java - 部署在 mochahost 共享服务器上时出现 NullPointerException 获取连接

python - Pandas 日期时间表示的转换

python - 为什么Python的shelve要求所有key都是字符串?