相关文章推荐
俊秀的冲锋衣  ·  Python链表实现·  1 月前    · 
正直的键盘  ·  Python 有指针吗?_python中有没有指针·  1 月前    · 
耍酷的枕头  ·  Python txt 特定位置写入内容·  1 月前    · 
爱喝酒的充值卡  ·  几种编程语言中的索引开头是0还是1?_在计算 ...·  1 月前    · 
痴情的铁板烧  ·  前端開發環境 + React + TS - ...·  1 月前    · 
怕考试的木耳  ·  软件分享库合集链接汇总推荐_蓝奏云软件分享链 ...·  5 月前    · 
精明的日记本  ·  江西省发布第三批非法集资严重失信人名单 ...·  1 年前    · 
奔放的梨子  ·  Creating Word ...·  2 年前    · 
奔跑的苦咖啡  ·  地藏菩萨本愿经讲记(第十三卷)·  2 年前    · 
愤怒的菠萝  ·  异兽魔都(林田球创作的系列漫画)_搜狗百科·  2 年前    · 
Code  ›  由于未解析的引用(Mac ),由protoc生成的Python类不能在代码中导入。开发者社区
python mac protobuf 编程语言
https://cloud.tencent.com/developer/ask/sof/107376098
打篮球的香烟
1 年前
首页
学习
活动
专区
工具
TVP 最新优惠活动
返回腾讯云官网
提问

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

Stack Overflow用户
提问于 2022-10-18 11:32:15
EN

我尝试在我的项目中使用协议缓冲区,问题是当我使用 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.

  • 使用 Python 3.9.11 管理的vrtualenv与 pyenv 和 https://formulae.brew.sh/formula/protobuf

  • I一起下载了最新的python软件包从 https://github.com/protocolbuffers/protobuf/releases/tag/v21.7

  • I installed protobuf 与自制 https://formulae.brew.sh/formula/protobuf

  • I一起安装软件包 https://github.com/protocolbuffers/protobuf/tree/v21.7/python

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

我最后得到的包裹是:

$ 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
 
推荐文章
俊秀的冲锋衣  ·  Python链表实现
1 月前
正直的键盘  ·  Python 有指针吗?_python中有没有指针
1 月前
耍酷的枕头  ·  Python txt 特定位置写入内容
1 月前
爱喝酒的充值卡  ·  几种编程语言中的索引开头是0还是1?_在计算机编程中,行或元素的索引通常是从几开始的
1 月前
痴情的铁板烧  ·  前端開發環境 + React + TS - iT 邦幫忙::一起幫忙解決難題,拯救 IT 人的一天
1 月前
怕考试的木耳  ·  软件分享库合集链接汇总推荐_蓝奏云软件分享链接网站汇总手机 - 骑士助手
5 月前
精明的日记本  ·  江西省发布第三批非法集资严重失信人名单 _ 防范金融风险 _ 南昌县人民政府
1 年前
奔放的梨子  ·  Creating Word Application using Excel VBA: Run-time error '429': ActiveX component can't create obje
2 年前
奔跑的苦咖啡  ·  地藏菩萨本愿经讲记(第十三卷)
2 年前
愤怒的菠萝  ·  异兽魔都(林田球创作的系列漫画)_搜狗百科
2 年前
今天看啥   ·   Py中国   ·   codingpro   ·   小百科   ·   link之家   ·   卧龙AI搜索
删除内容请联系邮箱 2879853325@qq.com
Code - 代码工具平台
© 2024 ~ 沪ICP备11025650号