使用rules_python的py_proto_library导致google模块被覆盖的问题求助
解决rules_python中py_proto_library覆盖google模块导致google.auth无法访问的问题
问题原因
当通过py_proto_library引入原生Protocol Buffers仓库的Python代码时,其python/google目录会被加入Python搜索路径,且优先级高于PIP安装的google-auth所在的site-packages/google目录。这导致Python优先加载protobuf提供的google模块,而该模块仅包含protobuf子模块,没有auth,因此触发ModuleNotFoundError。
可行解决方案
方案1:改用PyPI版本的protobuf依赖
放弃直接依赖原生Protocol Buffers仓库的Python代码,改用PIP管理的protobuf包,确保所有google子模块(包括protobuf和auth)处于同一site-packages/google目录下:
- 在
requirements.txt中添加protobuf依赖项 - 通过
pip_install生成PIP依赖规则:load("@rules_python//python:pip.bzl", "pip_install") pip_install( name = "pypi", requirements = "//:requirements.txt", ) - 在
py_proto_library中引用PyPI版本的protobuf作为依赖:load("@rules_python//proto:py_proto.bzl", "py_proto_library") py_proto_library( name = "my_proto", deps = [":my_proto_lib"], proto_deps = ["@pypi//protobuf"], ) - 在
py_binary中同时依赖@pypi//google-auth和:my_proto
方案2:调整Python搜索路径优先级
通过py_binary的pythonpath参数,将PIP依赖的site-packages路径前置,确保Python优先加载包含google.auth的模块:
py_binary( name = "app", srcs = ["app.py"], deps = [ ":my_proto", "@pypi//google-auth", ], # 将google-auth和protobuf的site-packages路径放在最前面 pythonpath = [ "@pypi//google-auth:site-packages", "@pypi//protobuf:site-packages", ], )
方案3:修改protobuf依赖的导入路径
通过proto_library的strip_import_prefix或py_proto_library的imports参数,调整protobuf生成代码的导入路径,避免与全局google模块冲突:
proto_library( name = "my_proto_lib", srcs = ["my_proto.proto"], strip_import_prefix = "/path/to/proto", ) py_proto_library( name = "my_proto", deps = [":my_proto_lib"], imports = ["python"], )
这样生成的代码会从import google.protobuf变为import python.google.protobuf,不会覆盖全局google模块,但需要同步调整业务代码中的导入语句。
内容的提问来源于stack exchange,提问作者Chuan Ye
相关产品推荐
相关产品推荐

