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

时间:2016-02-11 14:41:23

标签: python protocol-buffers

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

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

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

这可能吗?

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

2 个答案:

答案 0 :(得分:7)

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

然而,据我所知,没有人完全把它捆绑在一起。 (免责声明:我的知识已经有几年了,我可能错过了一个新的开发,但我在文档中没有看到任何内容。)

顺便说一下,Cap'n Proto的Python实现确实做了你所描述的,证明它是可能的。但如果您需要使用Protobuf格式,这对您没有帮助。

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

答案 1 :(得分:1)

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

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