在 运行 时间从 protobuf 文件动态创建 python class?

Dynamically creating python class from a protobuf file at run time?

在 Python 中,是否有可能 在 运行 时间 将 Google Protocol Buffers .proto 文件转换为python class 读取该数据? Python 是一种非常动态的语言。当您使用 protoc.proto 文件转换为 python 源代码时,生成的代码会大量使用 python metaclasses,因此它是已经很有活力了。

理想情况下,我正在考虑这样的事情:

import whatever
module = whatever.load_from_file("myfile.proto")

这可能吗?

(我是协议缓冲区的新手,如果我的问题没有意义请告诉我)

从理论上讲,所有的部分都存在以完成这项工作。 Python protobuf 实现可以调用 C++ .proto 解析器库 (libprotoc) 作为 C 扩展来获取描述符,然后可以将它们提供给元类。

然而,据我所知,还没有人完全将其捆绑在一起。 (免责声明:我的知识是几年前的,我可能错过了一个新的发展,但我没有在文档中看到任何东西。)

顺便说一句,Cap'n Proto 的 Python 实现确实按照您的描述进行,证明这是可能的。但是,如果您需要使用 Protobuf 格式,那对您没有帮助。

(披露:我是 Google 大部分开源 Protobuf 代码的作者,我也是 Cap'n Proto 的作者。)

这个问题最优雅的解决方案是使用init.py。参见:What is __init__.py for?

您可以调用脚本在 init.py 中生成 Python protobuf 类。导入后,将自动调用该脚本生成 Python protobuf 类.