为了账号安全,请及时绑定邮箱和手机立即绑定

无法将重复的 protobuf 对象保存到文件 (Python)

无法将重复的 protobuf 对象保存到文件 (Python)

大话西游666 2023-03-30 16:54:14
我是 protobuf 的新手,所以我不知道如何正确地提出问题。无论如何,我正在使用这个模型配置原型文件。我使用Protocol Buffer pageprotoc -I=. --python_out=. ./model_server_config.proto中的这个命令将它转换成 python 。现在我有一些可以导入和处理的 python 文件。我的目标是创建一个文件(用于运行具有多个模型的 TensorFlow 模型服务器),该文件应如下所示:model_config_list: { config: {    name: "name1",    base_path: "path1",    model_platform: "tensorflow"  },  config: {    name: "name2",    base_path: "path2",    model_platform: "tensorflow"  },  config: {    name: "name3",    base_path: "path3",    model_platform: "tensorflow"  },}现在使用编译的 python 包,我制作了一个 protobuf 对象,当我打印出来时它看起来像这样:model_config_list {  config {    name: "name1"    base_path: "path1"    model_platform: "tensorflow"  }  config {    name: "name2"    base_path: "path2"    model_platform: "tensorflow"  }  config {    name: "name3"    base_path: "path3"    model_platform: "tensorflow"  }}但是在使用序列化对象时objectname.SerializeToString(),我得到一个奇怪的输出:b'\n\x94\x01\n \n\x04name1\x12\x0cpath1"\ntensorflow\n7\n\x08name2\x12\x1fpath2"\ntensorflow\n7\n\x08name3\x12\x1fpath3"\ntensorflow'我尝试使用 python 的 protobuf 将它转换为 Json,如下所示:from google.protobuf.json_format import MessageToJsonMessageToJson(objectname)这给了我这样的结果:{  "modelConfigList": {    "config": [      {        "name": "name1",        "basePath": "path1",        "modelPlatform": "tensorflow"      },      {        "name": "name2",        "basePath": "path2",        "modelPlatform": "tensorflow"      },      {        "name": "name3",        "basePath": "path3",        "modelPlatform": "tensorflow"      }    ]  }}列表中的所有对象和每个对象都是字符串,这对于 TensorFlow 模型服务器配置来说是不可接受的。关于如何将其正确写入文件的任何想法?还是我错误地创建了整个对象?欢迎任何帮助,在此先感谢。
查看完整描述

1 回答

?
慕妹3146593

TA贡献1820条经验 获得超9个赞

我不知道什么系统将读取你的文件,所以我不能说你应该如何将它写入文件。这实际上取决于模型服务器期望如何读取它。

也就是说,我没有发现您创建消息的方式或您展示的任何序列化方法有任何问题。

  • print方法显示了一个“文本格式”proto,有利于调试,有时用于存储配置文件。它不是很紧凑(字段名称存在于文件中)并且不具有二进制表示的所有向后和向前兼容的功能。它实际上在功能上与您所说的“应该看起来像”相同:冒号和逗号实际上是可选的。

  • SerializeToString()方法使用二进制序列化格式。这可以说是 Protocol Buffers 的构建目的。它是一种紧凑的表示形式,并提供向后和向前的兼容性,但人类可读性不高。

  • 顾名思义,该json_format模块提供消息的 JSON 表示形式。如果您正在与之交互的系统需要 JSON,那就太好了,但这并不常见。

附录:不使用print(),该google.protobuf.text_format模块具有更适合以编程方式使用文本格式的实用程序。要写入文件,您可以使用:

from google.protobuf import text_format

(...)

with open(file_path, 'w') as output:

  text_format.PrintMessage(my_message, output)


查看完整回答
反对 回复 2023-03-30
  • 1 回答
  • 0 关注
  • 124 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信