问题标签 [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 回答
114 浏览

python - python:导入protobuf生成文件的问题

我正在测试 protobuf 生成的文件以用于 python。我遇到的问题是 protobuf 将生成的 python 文件分隔在目录中,然后我在使用 python2 导入时遇到问题。

说,我有目录commona,每个目录都有自动生成的(通过 protobuf)py 文件。如果您查看 中的一个文件a,它有一个导入内容:

因此,我正在创建另一个脚本来将文件导入a. 所以....如果我尝试将父级(commona)提供给 PYTHONPATH,我似乎找不到将脚本导入到的方法a

(blah.py 是里面的自动生成的 py 文件a)我明白了:

所以....如果我尝试将a目录添加到 PYTHONPATH (并将导入调整为只说import blah,那么我开始遇到从 common 导入的问题(在自动生成的 blah.py 文件中的导入语句a):

这应该是什么解决方法?

0 投票
1 回答
1156 浏览

python - protobuf 和 python:protoc 可以生成 __init__.py 文件吗?

有没有办法让 protoc__init__.py在它用来生成 .py 文件的目录中生成空文件,以便它们可以用作模块?

0 投票
0 回答
199 浏览

python - 在 python 中更改 protobuf 对象的元素最优雅的方法是什么?

这是一个代表 protobuf 对象的配置文件

我希望使用 python 将其读入对象,对某些值进行一些更改,然后将其写回配置文件。

一个复杂的因素是这是一个相当大的对象,它由许多 .proto 文件构成。

我能够通过将 protobuf 转换为字典、进行编辑然后转换回 protobuf 来完成任务,如下所示:

我希望能够直接对 protobuf 对象进行编辑,而无需转换为字典。然而,问题是不清楚如何“走 dom”以发现对我想更改其值的变量的正确引用。当涉及多个 .proto 文件时尤其如此。

我能够像这样进行编辑,但我希望有更好的方法:

0 投票
0 回答
23 浏览

protocol-buffers - 有没有办法一起编译 protobuf 及其所有插件?

现在我需要分别编译我的 protobuf 和所有插件(导入)。

0 投票
1 回答
422 浏览

python-3.x - URL 解码和反序列化失败

使用协议缓冲区我序列化数据并通过将其作为参数添加到发送到 Flask 的 HTTP GET 请求来传输它。数据的反序列化有时会失败,具体取决于参数的内容(例如,如果 url 参数包含“%F0”)。

我尝试使用不同的字符集进行编码/解码,还尝试将适当的标头添加到请求设置 content-type 到 application/x-protobuf。

这是烧瓶处理传入 GET 请求的代码。

这是创建和发送 GET 请求的代码。

这是显示 Control 对象结构的 protobuffer 代码。

commands.SerializeToString()方法中第二个片段中的调用control(...)yield b'\n\x13\n\n\n\x08fancySid\x12\x05\n\x03ego\x12\t\t\x00\x00\x00\x00\x00\x00\xf0?'address + "?" + urlencode(params)在方法中的第二个片段中的评估_do_get_request(...)产生的输出/ai/control?control=%0A%13%0A%0A%0A%08fancySid%12%05%0A%03ego%12%09%09%00%00%00%00%00%00%F0%3F似乎是相同的,但 urlencoded。

在方法yieldrequest.args["control"]的第一个片段中将此 GET 请求发送到烧瓶时,它不再是相同的序列化字符串。尝试反序列化此字符串失败并出现错误。control()'\n\x13\n\n\n\x08fancySid\x12\x05\n\x03ego\x12\t\t\x00\x00\x00\x00\x00\x00�?'google.protobuf.message.DecodeError: Error parsing message

我该怎么做才能让烧瓶正确读取参数?

0 投票
1 回答
1091 浏览

python - Python Implementing protobuf --decode-raw in python

I am dealing with the protobuf protocol and I encounter the need of decoding messages of unknown fields and types. I know protoc --decode_raw does a good job at that (alas not precise but good enough).

I was thinking about running protoc --decode-raw in a shell and let Python read its content, parsing it as a dictionary, but I figure it is the last resort of implementation.

Is there a Pythonic method of implementing the same functionality?

0 投票
0 回答
643 浏览

python - 如何正确地将一个 .proto 文件导入另一个文件?

我正在尝试将一个 .proto ( ndarray.proto) 文件中定义的消息导入另一个 ( image.proto)。我的文件夹结构是:

在里面image.proto我有:

我希望我现在可以将 NDArray 分配给 image_data,但是当我在 Python 脚本中尝试以下操作时:

我收到一个错误:

我是否错误地将ndarray.proto文件导入到image.proto?

0 投票
1 回答
1551 浏览

python - 是否可以在单个 GRPC 服务器上运行同一服务的多个实例?

我试图查看是否可以在单个 GRPC 服务器上运行同一服务的不同实例,但看起来我无法这样做。所以我想知道我的测试是否做错了什么,或者根本不可能。

我的测试基于来自 grpc repo的示例/python/multiplex :

服务:

服务器:

客户:

由于我要为每次迭代打开一个新频道,我希望得到一个混合了“你好,你!这是吉姆!”的输出。和“你好,你!这是约翰!”,但我得到的只是:

也就是说,我添加到服务器的 GreeterServicer 的第一个服务,它应该忽略第二个服务实例。

所以,我的问题是,是否有可能在单个服务器上进行这样的操作,如果有一个最佳实践来处理这样的场景,我想要两个几乎相同的服务,参数化不同(例如不同的 grpc 服务器?这意味着负载两个实例之间的平衡)。

在我的特定场景中,要传递的参数是要在服务实现中使用的一些凭据,然后我的目标是让这两个相同的服务同时运行,以便最终用户不知道有多个实例。

0 投票
0 回答
567 浏览

python - PySpark 和 Protobuf 反序列化 UDF 问题

我收到此错误

Can't pickle <class 'google.protobuf.pyext._message.CMessage'>: it's not found as google.protobuf.pyext._message.CMessage

当我尝试在 PySpark 中创建 UDF 时。显然,它使用 CloudPickle 来序列化命令但是,我知道 protobuf 消息包含C++实现,这意味着它不能被腌制。

我已经尝试找到一种方法来覆盖CloudPickleSerializer,但是,我无法找到方法。

这是我的示例代码:

提前致谢。

0 投票
0 回答
2659 浏览

python - 使用 ProtoBuf 的相对导入:使用 ProtoBuf 生成 Python 类会给出 ModuleNotFoundError

protobuf 是否支持 python 的相对导入?

我未能成功创建支持此功能的 protobuf 构建脚本。从我的 .proto 文件生成 python 类时,如果我从创建生成的 .py 文件的同一文件夹中启动 python,我只能导入 python 模块。

我已经构建了以下 MVP。理想情况下,我想要一个结构,其中生成的 python 代码放置在一个单独的文件夹(例如./generated)中,然后我可以将其移动到其他项目中。我已经发布了我已经开始工作的方法,但我希望更有经验的人能够为我指出更好的解决方案。

基本信息:

  • Python 3.6.8
  • protobuf 3.11.3

文件夹结构:

尝试 1:相对导入

main_class.proto:

sub_class.proto:

协议命令:

从根文件夹:

protoc -I=schemas --python_out=generated main_class.proto sub/sub_class.proto

这会将 python 文件放在./generated文件夹中。

什么有效,什么无效

使用上面的方法,我可以在文件夹中启动 python./generated并使用导入

import main_class_pb2 as MC_proto.

.但是,当我从根文件夹(或任何其他文件夹)启动 python 时,使用导入

import generated.main_class_pb2 as MC_proto

产生错误ModuleNotFoundError: No module named 'sub'。基于this post,我手动修改生成的main_class_pb2.py-file如下

.通过在导入语句的开头添加in,我现在可以使用import generated.main_class_pb2 as MC_proto. 但是,每次都必须手动编辑生成的文件是非常不切实际的,所以我不喜欢这种方法。

尝试 2:绝对进口

我的第二种方法是尝试绝对进口。如果我知道我的项目根文件夹在哪里,我可以将 .proto 文件移动到我希望 python 类所在的位置并在那里生成它们。对于此示例,我使用了与之前相同的文件夹结构,但没有./generated-folder。我还必须更改 protoc 命令的根文件夹,这需要我修改main_class.proto文件中的 import 语句,如下所示:

main_class.proto:

协议命令

protoc -I=. --python_out=. schemas/main_class.proto schemas/sub/sub_class.proto

什么有效,什么无效

假设我的根文件夹也是我项目的根文件夹,这种方法现在让我可以在根文件夹中启动 python 并使用导入模块

import schemas.main_class_pb2

但是,这意味着我的 .proto 文件必须与该项目中的 python 文件位于相同的文件夹中,这看起来很混乱。这也意味着您必须从与项目相同的根文件夹中生成 python 文件,这并不总是可能的。.proto 文件可能用于为两个完全不同的应用程序创建一个通用接口,并且必须维护两个稍微不同的 protobuf 项目似乎违背了使用 protobuf 的目的。


示例 python 代码

我提供了一些示例 python 代码,可用于测试导入是否有效以及类是否按预期工作。此示例来自尝试 1,并假设从./generated文件夹启动 python