美文网首页
protobuf import 文件编译时 提示was not

protobuf import 文件编译时 提示was not

作者: 今夜秋风和 | 来源:发表于2021-07-03 14:11 被阅读0次

    一.问题产生背景

    最近业务中在对接grpc 接口,其中grpc 采用了protobuf 这种结构化的数据存储格式,可用于结构化数据的序列化,目前官方中已经支持多种语言。在一个proto 文件 import 另一个proto 文件,编译时报错 (Import "zeus/file.proto" was not found or had errors) 问题,接下来还原一下产生的这个问题;

    二.项目搭建以及环境安装

    1. 项目搭建
      利用pycharm 新建一个工程,其中分别在不同目录下新建一个file_transfer.proto文件和file.proto 文件,如图所示:


      a.jpeg

      分别解释一下其中的含义:
      file.proto 定义了文件的Hash 消息体,因为需要进行文件的分片上传;
      file_transfer.proto 定义了分片信息,其中import "zeus/file.proto"; 引用了file.proto 文件;

    2. 环境安装
      安装grpc 包(pip3 install grpcio)
      安装protobuf(pip3 install protobuf)
      安装grpc的protobuf编译工具(pip3 install grpcio-tools)
    3. 编译过程


      b.jpeg

    三.问题分析

    • 编译时提示的问题:
      1. 我们没有使用 --proto_path (or -I). 指定搜索的路径,因为file_transfer.proto 这个文件有存在的import 其他的文件,需要指定搜索目录,假设不指定,grpcio-tools 不知道如何进行所import 文件的查找;
      2. proto_path 是.proto 文件的直接前缀,换句话说,proto_path 指定的目录和我们import 的文件所拼接形成的文件目录是一个连续的,可直接访问的 proto(后面进行反证) ;
      3. 关于--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

    四.总结

    1. 编译时没有找到文件的目录->2.是否有参数可以指定搜索目录->3.参数的官方说明是怎么样的->4.进行结果验证

    相关文章

      网友评论

          本文标题:protobuf import 文件编译时 提示was not

          本文链接:https://www.haomeiwen.com/subject/lrpuultx.html