python 多个proto文件import引用时出现ModuleNotFoundError错误_import "./module_sys.proto" was not found or had e-程序员宅基地

技术标签: protobuf  python  proto  测开  

问题描述

my_proto文件夹里有两个proto文件,book.proto想要引用person.proto文件中的Person,如下
book.proto

syntax = "proto2";

import "person.proto"; // 导入person.proto文件

message Book {
	optional string name = 1;
	optional float price = 2;
	optional Person author = 3;
}

person.proto

syntax = "proto2";

message Person {
	optional string name = 1;
	optional float height = 2;
	optional int32 age = 3;
	optional SEX sex = 4 [ default = MALE ];
	repeated Phone phone = 5;

	message Phone {
		optionale string number = 1; 
		optional Type type = 2;
	}
	
	enum Type {
		HOME = 0;
		MOBILE = 1;
	}

	enum SEX {
		MALE = 0;
		FEMALE = 1;
	}
}

使用protoc编译protoc文件后,my_proto文件夹中的文件为:person.proto, book.proto, person_pb.py, book_pb.py
person_pb.py文件中出现以下引用

import person_pb2 as person__pb2

构建my_test.py进行测试

import string
from my_proto import person_pb2, book_pb2

book = book_pb2.Book()
book.name = "python"
book.price = 56.7
person = book.person

person.name = "test"
person.sex = 0
person.height = 175.3
person.age = 26

for i in range(2)
	tel = person.phone.add()
	tel.number = "".join(random.choice(string.digits) for k in range(11))
	tel.type = random.choice([0, 1])

serizalized_book = book.SerizalizeToString()
print(f"serizalized book {
      serizalized_book}")

new_book = book_pb.Book()
new_book.ParseFromString(serizalized_book)
print(f"deserizalized book {
      new_book}")

运行时报错:import person_pb2 as person__pb2
ModuleNotFoundError: No module named ‘person_pb2’

解决方案

ModuleNotFoundError错误通常都是由于引用路径的位置不正确导致的
方法一:

# 修改book_pb.py文件
# import person_pb.py as person__pb.py
from . import person_pb.py as person__pb.py

方法二:

# 在my_proto文件夹中增加__init__.py文件
import sys
import os

sys.path.append(os.path.dirname(__file__))

参考文章:https://qa.1r1g.com/sf/ask/3775421401/

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/belong_to_you/article/details/133324027

智能推荐

【Git】Git中 tag 与 branch 的关系与使用_git tag和branch-程序员宅基地

文章浏览阅读1.9k次,点赞4次,收藏3次。标签是用于标记特定提交的静态引用。它是一个有意义的名称,用于表示项目的里程碑、版本发布或重要的提交。标签是不可变的,一旦创建就不会随着新的提交而移动。标签可以是轻量标签(lightweight tag),只是一个指向特定提交的引用也可以是注释标签(annotated tag),它包含了额外的信息(如标签的作者、日期、注释等)分支是代码开发过程中的不同线路或方向。每个分支都是从主分支(一般是master)派生出来的,开发者可以在分支上进行独立的工作,而不会影响主分支或其他分支。_git tag和branch

matlab进行fft变换,画出频谱图_matlab傅里叶变换后画频谱图-程序员宅基地

文章浏览阅读3.2w次,点赞19次,收藏133次。一、fft()函数matlab提供了快速傅里叶变换的函数fft(),fft函数能够进行指定点数的快速傅里叶变换。调用格式如下:resfft = fft(data1,1000); %resfft,fft 变换结果, data1--进行变换的数据,1000--指定1000点fft变换二、画出频谱图N = 1000; %点数n = 0:N-1; fs = 1000; %采样频率figureplot(n/N*fs,abs(resfft));..._matlab傅里叶变换后画频谱图

STM32输入上拉下拉 寄存器怎么设置实现_上拉输入怎么写-程序员宅基地

文章浏览阅读1w次,点赞5次,收藏13次。STM32输入上拉下拉 寄存器怎么设置实现在输出模式下:ODR是数据输出寄存器,但是在 输入模式下,同时也用来配置上拉下拉设置。在Alientek的源码中的按键输入实验中有如下一段初始化代码:void KEY_Init(void){ RCC->APB2ENR|=1 GPIOA->CRL&=0XFFFFFFF0;//PA0设置成输入_上拉输入怎么写

Oracle数据库中instr()与substr()函数详解_oracle instr substr-程序员宅基地

文章浏览阅读3.4k次,点赞2次,收藏12次。instr()函数(俗称:字符查找函数)格式1:instr( string1, string2 ) 格式1解释 :instr(源字符串, 目标字符串)格式2:instr( string1, string2, start_position, nth_appearance) 格式2解释:instr(源字符串, 目标字符串, 起始位置, 匹配序号)实例格式1实例select instr('helloworld','l') from table--返回结果:3 默认第..._oracle instr substr

第五章 相似矩阵及二次型_相似矩阵及二次型总结-程序员宅基地

文章浏览阅读798次。线性代数同济版 第五章 相似矩阵及二次型 易错题和总结_相似矩阵及二次型总结

随便推点

在VC6.0下编译osip、exosip协议栈的方法 _exosip_call_build_options-程序员宅基地

文章浏览阅读3.2k次。原文http://blog.csdn.net/wiizane/archive/2007/04/10/1559654.aspx打好包的代码在我的资源里,明明上传了为什么不显示啊下载地址注 必须先编译osipparser2 然后是osip2 最后才是exosip2引用了pthread今天VC6.0环境下上对osip协议栈和exosip协议栈进行编译,学到不少知识,记录下来,当作今天_exosip_call_build_options

【Java刷题进阶】基础入门篇⑥-程序员宅基地

文章浏览阅读701次,点赞22次,收藏20次。Java基础学习主要以练习为主,很多朋友听完视频课程学会基础以后感觉对练手项目无从下手,这里推荐去牛客网看看,这里的IT题库内容很丰富,属于国内做的很好的IT学习网站,而且是课程+刷题+面经+求职+讨论区分享,一站式求职学习网站,最最最重要的里面的资源全部免费!!从基础开始练习,知识点编排详细,题目安排合理,题目表述以指导的形式进行。整个题单覆盖了java入门的全部知识点以及全部语法,通过知识点分类逐层递进,从基础开始到最后的实践任务,都会非常详细地指导你应该使用什么函数,应该怎么输入输出。...

socket的阻塞模式和非阻塞模式_socket的怎么设置非阻塞模式-程序员宅基地

文章浏览阅读7.1k次,点赞13次,收藏72次。文章目录socket的阻塞模式和非阻塞模式如何将socket设置为非阻塞模式send和recv函数在阻塞和非阻塞模式下的表现非阻塞模式下send和recv函数的返回值总结阻塞与非阻塞socket的各自使用场景socket的阻塞模式和非阻塞模式如何将socket设置为非阻塞模式无论是Windows还是Linux,默认创建的socket都是阻塞模式的。在linux上,我们可以使用fcntl函数或者ioctl函数给创建的socket增加O_NONBLOCK标志来将socket设置为非阻塞模式。int o_socket的怎么设置非阻塞模式

IPSEC---VPN-程序员宅基地

文章浏览阅读907次,点赞25次,收藏16次。提示:这里对文章进行总结:例如:以上就是今天要讲的内容,本文仅仅简单介绍了pandas的使用,而pandas提供了大量能使我们快速便捷地处理数据的函数和方法。

英飞凌TC3XX芯片执行软件复位后初始化失败的问题_英飞凌芯片复位地址-程序员宅基地

文章浏览阅读516次,点赞8次,收藏10次。在使用TC3xx芯片开发过程中,调用Mcu_PerformReset()接口函数进行软件复位,发现复位后restart,卡死在初始化过程中。由于调用的接口为软件复位,查询手册可知软件复位不会清ram,猜测可能是mcu初始化时校验ram,发现其中初始值不为0导致的错误。找到ModuleId为101的对应模块Mcu。中所示,修改MemMap_Common.h文件,将定段为NOINIT的变量改为定段到ZERO_INIT中。修改定段信息,将原本定段为NOINIT的变量改为定段到ZERO_INIT中,即初始化为0。_英飞凌芯片复位地址

vim 整行上下移动_vim上移一行-程序员宅基地

文章浏览阅读2.7k次。在/etc/vim/vimrc中添加下列的语句。使用“CTRL+方向键”来选择单行向上或向下移动。_vim上移一行

推荐文章

热门文章

相关标签