无法将重复的 protobuf 对象保存到文件 (Python)
Trouble saving repeated protobuf object to file (Python)
我是 protobuf 的新手,所以我不知道如何正确地提出问题。
无论如何,我正在使用这个Model Config proto file. I converted it into python using this command protoc -I=. --python_out=. ./model_server_config.proto
from Protocol Buffer page。现在我有一些可以导入和处理的 python 文件。我的 objective 是创建一个文件(用于 运行 具有多个模型的 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'
我尝试将其转换为 Json,也使用 python 的 protobuf,如下所示:
from google.protobuf.json_format import MessageToJson
MessageToJson(objectname)
这给了我这样的结果:
{
"modelConfigList": {
"config": [
{
"name": "name1",
"basePath": "path1",
"modelPlatform": "tensorflow"
},
{
"name": "name2",
"basePath": "path2",
"modelPlatform": "tensorflow"
},
{
"name": "name3",
"basePath": "path3",
"modelPlatform": "tensorflow"
}
]
}
}
所有对象都在一个列表中,每个对象都是字符串,这对于 TensorFlow 模型服务器配置是不可接受的。
关于如何将其正确写入文件的任何想法?还是我错误地创建了整个对象?欢迎任何帮助,提前致谢。
我不知道什么系统会读取你的文件,所以我不能说你应该如何将它写入文件。这实际上取决于模型服务器期望如何读取它。
也就是说,我看不出您创建消息的方式或您展示的任何序列化方法有任何问题。
print
方法展示了一个“文本格式”proto,有利于调试,有时用于存储配置文件。它不是很紧凑(字段名称存在于文件中)并且不具有二进制表示的所有向后和向前兼容的功能。它实际上在功能上与您所说的“应该看起来像”相同:冒号和逗号实际上是可选的。
SerializeToString()
方法使用二进制serialization format。这可以说是 Protocol Buffers 的构建目的。它是一种紧凑的表示形式,并提供向后和向前的兼容性,但人类可读性不高。
- 顾名思义,
json_format
模块提供消息的 JSON 表示。如果您正在与之交互的系统需要 JSON,那就太好了,但这并不常见。
附录:google.protobuf.text_format
模块不使用 print()
,而是具有更适合以编程方式使用文本格式的实用程序。要写入文件,您可以使用:
from google.protobuf import text_format
(...)
with open(file_path, 'w') as output:
text_format.PrintMessage(my_message, output)
我是 protobuf 的新手,所以我不知道如何正确地提出问题。
无论如何,我正在使用这个Model Config proto file. I converted it into python using this command protoc -I=. --python_out=. ./model_server_config.proto
from Protocol Buffer page。现在我有一些可以导入和处理的 python 文件。我的 objective 是创建一个文件(用于 运行 具有多个模型的 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'
我尝试将其转换为 Json,也使用 python 的 protobuf,如下所示:
from google.protobuf.json_format import MessageToJson
MessageToJson(objectname)
这给了我这样的结果:
{
"modelConfigList": {
"config": [
{
"name": "name1",
"basePath": "path1",
"modelPlatform": "tensorflow"
},
{
"name": "name2",
"basePath": "path2",
"modelPlatform": "tensorflow"
},
{
"name": "name3",
"basePath": "path3",
"modelPlatform": "tensorflow"
}
]
}
}
所有对象都在一个列表中,每个对象都是字符串,这对于 TensorFlow 模型服务器配置是不可接受的。
关于如何将其正确写入文件的任何想法?还是我错误地创建了整个对象?欢迎任何帮助,提前致谢。
我不知道什么系统会读取你的文件,所以我不能说你应该如何将它写入文件。这实际上取决于模型服务器期望如何读取它。
也就是说,我看不出您创建消息的方式或您展示的任何序列化方法有任何问题。
print
方法展示了一个“文本格式”proto,有利于调试,有时用于存储配置文件。它不是很紧凑(字段名称存在于文件中)并且不具有二进制表示的所有向后和向前兼容的功能。它实际上在功能上与您所说的“应该看起来像”相同:冒号和逗号实际上是可选的。SerializeToString()
方法使用二进制serialization format。这可以说是 Protocol Buffers 的构建目的。它是一种紧凑的表示形式,并提供向后和向前的兼容性,但人类可读性不高。- 顾名思义,
json_format
模块提供消息的 JSON 表示。如果您正在与之交互的系统需要 JSON,那就太好了,但这并不常见。
附录:google.protobuf.text_format
模块不使用 print()
,而是具有更适合以编程方式使用文本格式的实用程序。要写入文件,您可以使用:
from google.protobuf import text_format
(...)
with open(file_path, 'w') as output:
text_format.PrintMessage(my_message, output)