Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/tensorflow/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将重复的protobuf对象保存到文件时出现问题(Python)_Python_Tensorflow_Protocol Buffers_Proto_Protobuf Python - Fatal编程技术网

将重复的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",

我是protobuf的新手,所以我不知道如何正确地提出这个问题

不管怎样,我用的是这个原始文件。我使用以下命令将其转换为python
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()
在这里看起来特别有用。