我尝试在我的项目中使用协议缓冲区,问题是当我使用protoc
生成python类时。在Google提供的示例中,生成的文件看起来一点都不像,不能在任何文件中导入,因为有一些未解决的引用。
因此,我遵循了这个页面中的示例:https://developers.google.com/protocol-buffers/docs/pythontutorial
先决条件
https://github.com/protocolbuffers/protobuf/releases/tag/v21.7
Python 3.9.11
管理的vrtualenv与pyenv
和https://formulae.brew.sh/formula/protobuf
protobuf
与自制https://formulae.brew.sh/formula/protobuf
我最后得到的包裹是:
$ python --version
$ Python 3.9.11
$
$ protoc --version
$ libprotoc 3.21.7
$
$ pip freeze | grep protobuf
$ protobuf==3.20.2
密码
首先,我尝试从本教程.proto
文件生成python类:
syntax = "proto2";
package tutorial;
message Person {
optional string name = 1;
optional int32 id = 2;
optional string email = 3;
enum PhoneType {
MOBILE = 0;
HOME = 1;
WORK = 2;
}
message PhoneNumber {
optional string number = 1;
optional PhoneType type = 2 [default = HOME];
}
repeated PhoneNumber phones = 4;
}
message AddressBook {
repeated Person people = 1;
}
然后使用命令生成python类。
protoc -I=. --python_out=. tutorial.proto
输出文件是:
# -*- coding: utf-8 -*-
# Generated by the protocol buffer compiler. DO NOT EDIT!
# source: tutorial.proto
"""Generated protocol buffer code."""
from google.protobuf.internal import builder as _builder
from google.protobuf import descriptor as _descriptor
from google.protobuf import descriptor_pool as _descriptor_pool
from google.protobuf import symbol_database as _symbol_database
# @@protoc_insertion_point(imports)
_sym_db = _symbol_database.Default()
DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x0etutorial.proto\x12\x08tutorial\"\xd5\x01\n\x06Person\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\n\n\x02id\x18\x02 \x01(\x05\x12\r\n\x05\x65mail\x18\x03 \x01(\t\x12,\n\x06phones\x18\x04 \x03(\x0b\x32\x1c.tutorial.Person.PhoneNumber\x1aG\n\x0bPhoneNumber\x12\x0e\n\x06number\x18\x01 \x01(\t\x12(\n\x04type\x18\x02 \x01(\x0e\x32\x1a.tutorial.Person.PhoneType\"+\n\tPhoneType\x12\n\n\x06MOBILE\x10\x00\x12\x08\n\x04HOME\x10\x01\x12\x08\n\x04WORK\x10\x02\"/\n\x0b\x41\x64\x64ressBook\x12 \n\x06people\x18\x01 \x03(\x0b\x32\x10.tutorial.Person')
_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, globals())
_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'tutorial_pb2', globals())
if _descriptor._USE_C_DESCRIPTORS == False:
DESCRIPTOR._options = None
_PERSON._serialized_start=29
_PERSON._serialized_end=242
_PERSON_PHONENUMBER._serialized_start=126
_PERSON_PHONENUMBER._serialized_end=197
_PERSON_PHONETYPE._serialized_start=199
_PERSON_PHONETYPE._serialized_end=242
_ADDRESSBOOK._serialized_start=244
_ADDRESSBOOK._serialized_end=291
# @@protoc_insertion_point(module_scope)
因此,如您所见,没有创建元类,行DESCRIPTOR.options=None
下面的所有常量都是未解析的引用。
当我稍后尝试导入该文件时,运行时显然会崩溃,因为这不是一个有效的Python文件。
有什么想法吗?
发布于 2022-10-18 14:43:30
示例代码运行良好,问题就在我的代码的其他地方。
让我对代码产生疑问的几件令人困惑的事情是:
_PERSON
这样的描述符,但在启动时代码仍然工作。所以是的,我花了时间调试一个不存在的问题;)。
https://stackoverflow.com/questions/74110251
复制相似问题