一.问题产生背景
最近业务中在对接grpc 接口,其中grpc 采用了protobuf 这种结构化的数据存储格式,可用于结构化数据的序列化,目前官方中已经支持多种语言。在一个proto 文件 import 另一个proto 文件,编译时报错 (Import "zeus/file.proto" was not found or had errors) 问题,接下来还原一下产生的这个问题;
二.项目搭建以及环境安装
-
项目搭建
利用pycharm 新建一个工程,其中分别在不同目录下新建一个file_transfer.proto文件和file.proto 文件,如图所示:
a.jpeg
分别解释一下其中的含义:
file.proto 定义了文件的Hash 消息体,因为需要进行文件的分片上传;
file_transfer.proto 定义了分片信息,其中import "zeus/file.proto"; 引用了file.proto 文件; - 环境安装
安装grpc 包(pip3 install grpcio)
安装protobuf(pip3 install protobuf)
安装grpc的protobuf编译工具(pip3 install grpcio-tools) -
编译过程
b.jpeg
三.问题分析
- 编译时提示的问题:
- 我们没有使用 --proto_path (or -I). 指定搜索的路径,因为file_transfer.proto 这个文件有存在的import 其他的文件,需要指定搜索目录,假设不指定,grpcio-tools 不知道如何进行所import 文件的查找;
- proto_path 是.proto 文件的直接前缀,换句话说,proto_path 指定的目录和我们import 的文件所拼接形成的文件目录是一个连续的,可直接访问的 proto(后面进行反证) ;
-
关于--proto_path 参数的说明(使用命令protoc --help):
c.jpeg
解释了 查找文件的过程,为了进行import 文件的查找,需要指定初始化目录,如果不指定,会从当前工作目录搜索,proto_path 可以指定多次,按照搜索的顺序依次查找;
-
接下来重新进行编译(证明3.2):
d.jpeg
--proto_path 指定了/Users/xiaolin.zhang/Documents/myproject/myProjectStudy/python/file_analysis 目录,也就是zeus 父目录的父目录,会有这样一个思考点,要是都引用于同一个父目录下的子目录的文件,可不可以一次只指定一个父目录来解决问题,发现其实不行的,grpcio-tools 并没有那样的智能化,所以还是得每个不同目录的import 文件单独指定proto_path;
-
修改上面的路径后,最终进行编译:
f.jpeg
编译通过了,也看到了生成的file_transfer_pb2.py 和file_transfer_pb2_grpc.py;
g.jpeg
四.总结
- 编译时没有找到文件的目录->2.是否有参数可以指定搜索目录->3.参数的官方说明是怎么样的->4.进行结果验证
网友评论