python3 grpc编译器:如何处理.protos中的绝对和相对导入?

潜水

我正在尝试从容器化的API .proto文件生成工作的Python模块,如下所示:https : //github.com/containerd/containerd/tree/master/api

不幸的是,容器自身的.proto文件包含诸如(in api/events/container.proto)之类的引用

import weak "github.com/containerd/containerd/protobuf/plugin/fieldpath.proto";

现在,此导入实际上位于protobuf/plugin/fieldpath.protovendor/,而不是github.com/containerd/...一个简单的方法-I ...在这种情况下不起作用,因为导入使用“ github”绝对路径,而相应的源不在供应商分支内。

vendor/github.com/...在尝试使用生成的Python模块时,简单地复制内部源代码将导致运行时错误:这是因为现在有两个单独的实例,用于同一协议元素尝试使用相同的协议元素名称向GRPC注册,但来自两个不同的Python模块。因此,GRPC Python运行时将引发错误并终止。

使用时如何正确解决此问题python3 -m grpc.tools.protoc ...

潜水

经过一番尝试+错误后,我终于提出了一个可行的解决方案,其工作方式如下,它可能比其他基于gRPC的示例更为复杂的面向基于gRPC的API的其他人有所帮助。

  1. 将API .proto文件复制到反映最终所需的Python包和模块结构的目录结构中。对于容器化,这意味着将所有内容都包含在容器化/目录结构中,避免了github.com/文件夹和别名(导入别名会破坏事情)。
  2. 修复所有可能导致模块别名或与最终所需的包结构不匹配的导入语句路径。一个很好的方法是在原始文件上复制时使用sed。就我而言,仅用“ containerd / ...”导入路径替换“ github.com/containerd/containerd / ...”。
  3. 如果供应商提供的.proto文件某种程度上与gRPC基础结构有关,并且存在gRPC PyPI软件包(例如grpcio和protobuf),则将它们与您的API .proto文件并排放置,但不要将它们供应到API目录中层次结构。确保将它们放在模仿已经可用的PyPI软件包的软件包结构的目录结构中。
  4. 通过python3解释器使用protoc仅为您的API .proto文件生成Python模块;确保来自grpc和protobuf的补充.proto文件包括在内,但不要为其创建模块。除非您将补充.proto文件供应到API .proto文件中,否则protoc已经正确执行了此操作,因此请不要这样做。
  5. 确保您的grpcio和protobuf PyPI软件包是最新的并且以某种方式同步,避免特别是完全过时的Debian发行版软件包,从PyPI安装...即使在arm64上这是一个痛苦的缓慢过程,因为没有适用于grpcio和grpciotools的二进制轮。不这样做的症状包括缺少grpc或protobuf对象字段的运行时错误。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

Python编译器和虚拟机如何处理eval表达式?

如何在python 3.6中使用绝对导入和相对导入?

编译器如何处理枚举中的符号常量?

如何处理错误引发-Python3中的Asyncio

如何在绝对导入中设置不带点号的Pypi软件包-Python3

如何在带有if __name __ ='__ main__'块的Python3中使用相对导入?

Python3中的异常处理

访问者模式和编译器代码生成,如何处理分配?

未使用的原语数组:javac和JIT编译器如何处理它?

Python3和hmac。如何处理不是二进制的字符串

如何从python3中的同级目录导入?

如何在python3中导入mysqlclient

Python3中的多处理和死锁问题

C ++编译器(或链接器)如何知道如何处理cpp和标头类文件?

如何在Python3中列出导入的模块和版本

正确处理Python2和Python3

方法和类在Python3解释器中的位置

Python模块的绝对导入和相对导入:matplotlib示例

在C#编译器和虚拟机中如何处理lambda表达式?

您可以在python中同时使用相对和绝对导入吗?

如何从Python3的子目录导入函数

赋值中涉及二进制运算时,编译器如何处理自动变量

Python模块的绝对和显式相对导入

无法在VSCode中运行python3调试器

python3中的数据包嗅探器

如何安装和调用IDLE for Python3?

如何使用gio和python3获取文件图标

如何在Python3中的类中调用函数

在Python3 / tkinter中,如何相对于其父窗口大小设置框架的大小?

TOP 榜单

热门标签

归档