亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

無法將重復的 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 關注
  • 159 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號