首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >由于未解析的引用(Mac ),由protoc生成的Python类不能在代码中导入。

由于未解析的引用(Mac ),由protoc生成的Python类不能在代码中导入。
EN

Stack Overflow用户
提问于 2022-10-18 11:32:15
回答 1查看 102关注 0票数 1

我尝试在我的项目中使用协议缓冲区,问题是当我使用protoc生成python类时。在Google提供的示例中,生成的文件看起来一点都不像,不能在任何文件中导入,因为有一些未解决的引用。

因此,我遵循了这个页面中的示例:https://developers.google.com/protocol-buffers/docs/pythontutorial

先决条件

https://github.com/protocolbuffers/protobuf/releases/tag/v21.7

  • I

  • 操作系统macOS 12.6在M1 Mac.

  • I也复制了上述原型包中的c++原版,看看它是否有帮助,但它没有用

我最后得到的包裹是:

代码语言:javascript
复制
$ python --version
$ Python 3.9.11
$ 
$ protoc --version
$ libprotoc 3.21.7
$
$ pip freeze | grep protobuf
$ protobuf==3.20.2

密码

首先,我尝试从本教程.proto文件生成python类:

代码语言:javascript
复制
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类。

代码语言:javascript
复制
protoc -I=. --python_out=. tutorial.proto

输出文件是:

代码语言:javascript
复制
# -*- 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文件。

有什么想法吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-10-18 14:43:30

示例代码运行良好,问题就在我的代码的其他地方。

让我对代码产生疑问的几件令人困惑的事情是:

  1. 官方页面上的示例已经过时了。Google已经改变了生成原型的方式,不再有元类。
  2. 有动态导入,因此IDE会突出显示像_PERSON这样的描述符,但在启动时代码仍然工作。

所以是的,我花了时间调试一个不存在的问题;)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74110251

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档