问题标签 [protobuf-python]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
694 浏览

protocol-buffers - 您可以为重复的 Protobuf 消息中的一个字段分配多个不同的值类型吗?

我正在尝试对将音频文件上传到服务器的客户端进行逆向工程,然后在单独的请求中上传文件的元数据。元数据在 Protobuf 中被序列化,它使用相当简单和可读的结构。这是它之后的样子protoc --decode_raw

它似乎只是字段的重复消息,1每次都包含一个键值对,但有时该值是一个字符串,有时它是一个更复杂的消息。2如果 Protobuf 只允许您在每个字段中使用一种值类型,他们如何将字符串和消息都分配给字段?如果我要制定自己的请求,我需要这样的东西:

但这不起作用,因为Field number 2 has already been used in "package.name" by field "str_value". 有任何想法吗?我将使用 Python 创建和发送请求数据。

0 投票
1 回答
125 浏览

protocol-buffers - 如何在 Google 开发者网站上使用 Python 制作基本的 protobuf 程序?

我正在关注使用 Python 的 protobuf 教程(没有用于 JavaScript 的教程)。它不起作用......而且我认为它proto2作为 Python 2 程序可能已经过时了。如何让它发挥作用?

所以我开始创建一个文件address.proto

  1. 然后我protoc在 Mac 上安装

  2. 然后我创建了两个文件夹InOut,并移动address.protoIn,并运行:

然后创建了一个文件:Out/address_pb2.py,我去了Out,并添加了文件run.py

然后我安装并运行:

看起来我必须将代码转换为run.pyprint 123到,print(123)因为它是 Python3,而不是 Python2。它给了:

我还将文件复制addressbook_pb2.pyfoo.py,然后改用import foo它,它给出了:

如何让它发挥作用?

0 投票
1 回答
470 浏览

python-3.x - 协议缓冲区 ParseFromString 函数未在 Python 中读取完整的二进制文件

我正在测试协议缓冲区并尝试读取 csv 文件,对其进行序列化并将输出写入二进制文件,然后使用 ParseFromString 读取二进制文件。我能够序列化和写入二进制文件,但是在读取它时会给出索引越界异常,或者在另一种情况下它只输出二进制文件的最后一行,它会跳过它之前的所有内容。

我的消息很简单,它有两个字段,时间和指标使用。

序列化和写入二进制文件代码如下:

麻烦的部分如下:

方法 1:这只返回二进制文件的最后一行。它会跳过之前的所有内容。

答案集中只有一行,而不是整个二进制文件

方法 2:如果我读取像上面的 csv 文件这样的序列化二进制文件,它会给我一个索引超出范围的错误。我的倾向是二进制文件可能是字节数据并且不包含给出此错误的字符串数据类型?

使用 message.ParseFromString() 读取这个二进制文件的正确方法是什么,因为通过循环读取它不起作用,也不能整体读取它?我创建的二进制文件的快照如下:

二进制输出

0 投票
0 回答
38 浏览

python - 使用 MessageToJson() 转换为 JSON 后,Protobuf 时间戳字段被重命名

我有一个 protobuf 消息,其 protobuf Timestamp 格式如下:

需要将其转换为 JSON,但是当我使用 MessageToJson() 将其转换为 JSON 时,如下所示:

它被转换成下面

我怎样才能避免这样做?请帮忙!

0 投票
0 回答
63 浏览

json - 如何在python中分配一个protobuf重复的复合字段?

现在我的 YAML 文件中有一个 SamplePosition 数组,如下所示:

如何将其分配给重复的复合字段?

0 投票
0 回答
337 浏览

python - 在tensorflow中解析协议缓冲区时如何使UTF-8数据无效?

我正在尝试使用我赢得的数据训练模型并且没有初始化检查点,这发生了。我不知道它的真正含义。

[libprotobuf ERROR google/protobuf/wire_format_lite.cc:577] 字符串字段“tensorflow.TensorShapeProto.Dim.name”在解析协议缓冲区时包含无效的 UTF-8 数据。如果您打算发送原始字节,请使用“字节”类型。Traceback(最近一次调用最后):文件“/home/hazel/pycharm/projects/LibRelated/MyGeoNet/geonet_main.py”,第 167 行,在 tf.app.run() 文件“/home/hazel/anaconda3/envs/ tf1.15/lib/python3.7/site-packages/tensorflow_core/python/platform/app.py”,第 40 行,在运行 _run(main=main, argv=argv, flags_parser=_parse_flags_tolerate_undef) 文件“/home/hazel /anaconda3/envs/tf1.15/lib/python3.7/site-packages/absl/app.py”,第 312 行,在运行 _run_main(main, args) 文件“/home/hazel/anaconda3/envs/tf1. 15/lib/python3.7/site-packages/absl/app.py”,第 258 行,在 _run_main 系统中。在里面 graph_def=graph.as_graph_def(add_shapes=True),文件“/home/hazel/anaconda3/envs/tf1.15/lib/python3.7/site-packages/tensorflow_core/python/framework/ops.py”,第 3238 行,在 as_graph_def 结果中,_ = self._as_graph_def(from_version, add_shapes) 文件“/home/hazel/anaconda3/envs/tf1.15/lib/python3.7/site-packages/tensorflow_core/python/framework/ops.py”,第 3166 行,在 _as_graph_def graph.ParseFromString(compat.as_bytes(data)) google.protobuf.message.DecodeError: Error parsing message ERROR:tensorflow:================== =============== 从未使用过对象(类型 <class 'tensorflow.python.framework.ops.Tensor'>):<tf.Tensor 'report_uninitialized_variables/boolean_mask/GatherV2:0' shape=(?,) dtype=string> 如果要将其标记为已使用,请调用其“mark_used()”方法。它最初是在这里创建的:文件“/home/hazel/pycharm/projects/LibRelated/MyGeoNet/geonet_main.py”,第 148 行,在 train saver.save(sess, os.path.join(opt.checkpoint_dir, 'model' ), global_step=step) 文件“/home/hazel/anaconda3/envs/tf1.15/lib/python3.7/site-packages/tensorflow_core/python/util/deprecation.py”,第 324 行,在 new_func 返回 func( *args, **kwargs) 文件“/home/hazel/anaconda3/envs/tf1.15/lib/python3.7/site-packages/tensorflow_core/python/training/supervisor.py”,第 323 行,在第 324 行,在 new_func 返回 func(*args, **kwargs) 文件“/home/hazel/anaconda3/envs/tf1.15/lib/python3.7/site-packages/tensorflow_core/python/training/supervisor.py” ,第 323 行,在第 324 行,在 new_func 返回 func(*args, **kwargs) 文件“/home/hazel/anaconda3/envs/tf1.15/lib/python3.7/site-packages/tensorflow_core/python/training/supervisor.py” ,第 323 行,在在里面 graph_def=graph.as_graph_def(add_shapes=True),文件“/home/hazel/anaconda3/envs/tf1.15/lib/python3.7/site-packages/tensorflow_core/python/training/supervisor.py”,第 416 行,在 _init_ready_op self._ready_for_local_init_op = ready_for_local_init_op 文件“/home/hazel/anaconda3/envs/tf1.15/lib/python3.7/site-packages/tensorflow_core/python/util/tf_should_use.py”,第 198 行,包装返回 _add_should_use_warning (fn(*args, **kwargs)) =================================== E0923 10:19: 24.045361 140312382656704 tf_should_use.py:76] ================================== 对象从未使用过(类型 <class 'tensorflow.python.framework.ops.Tensor'>): <tf.Tensor 'report_uninitialized_variables/boolean_mask/GatherV2:0' shape=(?,) dtype=string> 如果要将其标记为已使用,请调用其“mark_used( )“ 方法。它最初是在这里创建的:文件“/home/hazel/pycharm/projects/LibRelated/MyGeoNet/geonet_main.py”,第 148 行,在 train saver.save(sess, os.path.join(opt.checkpoint_dir, 'model' ), global_step=step) 文件“/home/hazel/anaconda3/envs/tf1.15/lib/python3.7/site-packages/tensorflow_core/python/util/deprecation.py”,第 324 行,在 new_func 返回 func( *args, **kwargs) 文件“/home/hazel/anaconda3/envs/tf1.15/lib/python3.7/site-packages/tensorflow_core/python/training/supervisor.py”,第 323 行,在7/site-packages/tensorflow_core/python/util/deprecation.py”,第 324 行,在 new_func 返回 func(*args, **kwargs) 文件“/home/hazel/anaconda3/envs/tf1.15/lib/python3 .7/site-packages/tensorflow_core/python/training/supervisor.py”,第 323 行,在7/site-packages/tensorflow_core/python/util/deprecation.py”,第 324 行,在 new_func 返回 func(*args, **kwargs) 文件“/home/hazel/anaconda3/envs/tf1.15/lib/python3 .7/site-packages/tensorflow_core/python/training/supervisor.py”,第 323 行,在init graph_def=graph.as_graph_def(add_shapes=True),文件“/home/hazel/anaconda3/envs/tf1.15/lib/python3.7/site-packages/tensorflow_core/python/training/supervisor.py”,第416行,在 _init_ready_op self._ready_for_local_init_op = ready_for_local_init_op 文件“/home/hazel/anaconda3/envs/tf1.15/lib/python3.7/site-packages/tensorflow_core/python/util/tf_should_use.py”,第 198 行,包装返回_add_should_use_warning(fn(*args, **kwargs)) ================================= 进程结束退出代码 1

部分代码如下。现在我正在考虑删除Supervisor

0 投票
1 回答
65 浏览

python - Protobuf 生成的 Python 包内部的隐式相对导入使得从外部导入是不可能的

我有一个看起来像这样的包:

在 org_pb2_grpc.py 我有以下导入行:

我遇到的问题是,当我从alphausblue目录内部导入时,导入工作正常。但是,当我从包中创建一个轮子时,将其上传到 Test PyPI,再次下载并尝试将其导入到这样的测试环境中:

我得到上面的错误。我可以将代码从alphausblue/to移动/,然后导入工作,但我必须这样做org.v1.org_pb2_grpc,这不是我想要的。看来这应该可行,所以我在这里缺少什么?

更新 这似乎是protoc如何生成 Python 代码的问题。我将在这里调查潜在的解决方案,看看我自己是否无法解决问题。

0 投票
1 回答
72 浏览

protocol-buffers - 获取原始消息列表

我是 protobufs 的新手,我似乎无法理解它。我有一个这样的原始文件。

我已经将数据添加到看起来像这样的消息中。

data = Address.getfielddescriptor() 字段描述符方法不能返回像 data=['Cornfield','Ham'] 这样的值列表

我该怎么做?

0 投票
0 回答
245 浏览

python - Protobuf 3.19.1 和 Python 3.10 问题

当在 Linux 中使用最新的 Python Protobuf (3.19.1) 和 Python 3.10(在 Fedora 35 和 Ubuntu 20.04 中测试)时,这就是所有问题。

它破坏了我们的库,但它可以使用addressbook.protoPython Protobuf 教程中的轻松测试,并尝试获取 proto2 消息类,如下所示:

它引发以下错误:

现在,如果我使用较旧的 Python Protobuf 版本(例如 3.18.1),它可以按预期工作。

我打开了一个错误https://github.com/protocolbuffers/protobuf/issues/9245,但显然,它不被视为错误。

Python ProtobufPY_SSIZE_T_CLEAN在 3.19.1 中引入了宏并破坏了一些东西,可能是通过使用int而不是Py_ssize_t在使用#格式时。

有人有这个问题或可以确认吗?

0 投票
0 回答
10 浏览

protocol-buffers - 解析 protobuf 代码以了解类属性

我有 .proto 文件的列表,每个文件的结构看起来像

我会解析文件以了解包含的属性列表并生成一个表格

是否有任何 python 库/实用程序可以帮助我做到这一点?