将重复的protobuf对象保存到文件时出现问题(Python)
我是protobuf的新手,所以我不知道如何正确地提出这个问题 不管怎样,我用的是这个原始文件。我使用以下命令将其转换为python将重复的protobuf对象保存到文件时出现问题(Python),python,tensorflow,protocol-buffers,proto,protobuf-python,Python,Tensorflow,Protocol Buffers,Proto,Protobuf Python,我是protobuf的新手,所以我不知道如何正确地提出这个问题 不管怎样,我用的是这个原始文件。我使用以下命令将其转换为pythonprotoc-I=--python_out=/model_server_config.proto来自。现在我有一些python文件可以导入和处理。我的目标是创建一个文件(用于运行带有多个模型的TensorFlow模型服务器),该文件应如下所示: model_config_list: { config: { name: "name1",
protoc-I=--python_out=/model_server_config.proto
来自。现在我有一些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 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
方法使用二进制文件。这可以说是构建协议缓冲区的目的。它是一个紧凑的表示形式,提供了向后和向前的兼容性,但它不是很容易让人阅读的SerializeToString()
- 顾名思义,
模块提供了消息的json表示。如果您正在与之交互的系统需要JSON,那么这是非常好的,但这并不常见json_格式
print()
,而是提供了更适合以编程方式使用文本格式的实用程序。要写入文件,您可以使用:
from google.protobuf import text_format
(...)
with open(file_path, 'w') as output:
text_format.PrintMessage(my_message, output)
您的第一个示例(期望的输出):这是从哪里来的?@Omni感谢您的回答。我对这个概念很陌生,所以我不知道我对这个回答理解多少。我的目标是创建一个这样的配置文件。但是如果我序列化它并将其写入文件,它将不起作用,并抛出以下错误:解析文本格式tensorflow.serving.ModelServerConfig:2:1:解释非ascii代码点148。引用该页面:“提供的模型服务器配置文件必须是ASCII ModelServerConfig协议缓冲区。请参阅以下内容以了解ASCII协议缓冲区的外观。“他们似乎希望使用上面的文本格式(您从
print
获得的文本格式)。不幸的是,它有时被称为“ASCII格式”,尽管这是一个误称(它实际上使用utf-8)。那么,将该信息保存到文件中的最佳方式是什么呢?我不使用打印,而是使用模块,它与print()
相同,但有更多用于编程的控件。PrintMessage()
在这里看起来特别有用。