使用Bazel通过Pip依赖安装TensorFlow时缺失依赖致运行失败
问题原因与解决方案
核心问题
你手动筛选的requirements.txt.lock只保留了标记为“via tensorflow”的依赖,漏掉了TensorFlow运行时必需的深层传递依赖(比如absl-py);同时自定义的pip_requirements规则可能未正确处理依赖树的传递性,导致Bazel构建时没有引入完整的依赖链。
解决方案
1. 重新生成完整的依赖锁定文件
不要手动筛选依赖,直接用pip-compile生成包含所有直接/间接依赖的lock文件:
- 先创建基础的
requirements.in文件,内容仅需:tensorflow - 执行命令生成完整的lock文件:
该命令会自动解析TensorFlow的全部依赖树,包括pip-compile --output-file=requirements.txt.lock requirements.inabsl-py、numpy等所有运行时必需的包。
2. 替换为官方rules_python的依赖解析规则
当前使用的自定义pip_requirements规则可能存在依赖传递处理缺陷,改用官方pip_parse规则:
修改WORKSPACE文件内容为:
load("@rules_python//python:pip.bzl", "pip_parse") pip_parse( name = "pip", requirements_lock = "//py:requirements.txt.lock", ) load("@pip//:requirements.bzl", "install_deps") install_deps()
官方pip_parse会自动解析lock文件中的所有依赖,并生成正确的Bazel目标,确保传递依赖被完整引入。
3. 简化BUILD文件(无需手动添加子依赖)
你的BUILD文件无需额外修改,确认依赖引用正确即可:
load("@rules_python//python:defs.bzl", "py_binary") load("@pip//:requirements.bzl", "requirement") py_binary( name = "tensorflow_test", srcs = glob(["*.py"]), main = "main.py", deps = [ requirement("tensorflow"), ], )
requirement("tensorflow")会自动包含其所有传递依赖,无需手动添加absl-py等子依赖。
4. 清理缓存并重新构建
清理Bazel缓存避免旧依赖残留,然后重新运行:
bazel clean --expunge bazel run //py:tensorflow_test
内容的提问来源于stack exchange,提问作者Will.Evo
相关产品推荐
相关产品推荐

