问题标签 [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.
python - python:导入protobuf生成文件的问题
我正在测试 protobuf 生成的文件以用于 python。我遇到的问题是 protobuf 将生成的 python 文件分隔在目录中,然后我在使用 python2 导入时遇到问题。
说,我有目录common
和a
,每个目录都有自动生成的(通过 protobuf)py 文件。如果您查看 中的一个文件a
,它有一个导入内容:
因此,我正在创建另一个脚本来将文件导入a
. 所以....如果我尝试将父级(common
和a
)提供给 PYTHONPATH,我似乎找不到将脚本导入到的方法a
:
(blah.py 是里面的自动生成的 py 文件a
)我明白了:
所以....如果我尝试将a
目录添加到 PYTHONPATH (并将导入调整为只说import blah
,那么我开始遇到从 common 导入的问题(在自动生成的 blah.py 文件中的导入语句a
):
这应该是什么解决方法?
python - protobuf 和 python:protoc 可以生成 __init__.py 文件吗?
有没有办法让 protoc__init__.py
在它用来生成 .py 文件的目录中生成空文件,以便它们可以用作模块?
python - 在 python 中更改 protobuf 对象的元素最优雅的方法是什么?
我希望使用 python 将其读入对象,对某些值进行一些更改,然后将其写回配置文件。
一个复杂的因素是这是一个相当大的对象,它由许多 .proto 文件构成。
我能够通过将 protobuf 转换为字典、进行编辑然后转换回 protobuf 来完成任务,如下所示:
我希望能够直接对 protobuf 对象进行编辑,而无需转换为字典。然而,问题是不清楚如何“走 dom”以发现对我想更改其值的变量的正确引用。当涉及多个 .proto 文件时尤其如此。
我能够像这样进行编辑,但我希望有更好的方法:
protocol-buffers - 有没有办法一起编译 protobuf 及其所有插件?
现在我需要分别编译我的 protobuf 和所有插件(导入)。
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
我该怎么做才能让烧瓶正确读取参数?
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?
python - 如何正确地将一个 .proto 文件导入另一个文件?
我正在尝试将一个 .proto ( ndarray.proto
) 文件中定义的消息导入另一个 ( image.proto
)。我的文件夹结构是:
在里面image.proto
我有:
我希望我现在可以将 NDArray 分配给 image_data,但是当我在 Python 脚本中尝试以下操作时:
我收到一个错误:
我是否错误地将ndarray.proto
文件导入到image.proto
?
python - 是否可以在单个 GRPC 服务器上运行同一服务的多个实例?
我试图查看是否可以在单个 GRPC 服务器上运行同一服务的不同实例,但看起来我无法这样做。所以我想知道我的测试是否做错了什么,或者根本不可能。
我的测试基于来自 grpc repo的示例/python/multiplex :
服务:
服务器:
客户:
由于我要为每次迭代打开一个新频道,我希望得到一个混合了“你好,你!这是吉姆!”的输出。和“你好,你!这是约翰!”,但我得到的只是:
也就是说,我添加到服务器的 GreeterServicer 的第一个服务,它应该忽略第二个服务实例。
所以,我的问题是,是否有可能在单个服务器上进行这样的操作,如果有一个最佳实践来处理这样的场景,我想要两个几乎相同的服务,参数化不同(例如不同的 grpc 服务器?这意味着负载两个实例之间的平衡)。
在我的特定场景中,要传递的参数是要在服务实现中使用的一些凭据,然后我的目标是让这两个相同的服务同时运行,以便最终用户不知道有多个实例。
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
,但是,我无法找到方法。
这是我的示例代码:
提前致谢。
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