python - 如何在 bazel 中为 Python 和 pip 选择运行时?
问题描述
我正在尝试在 Ubuntu 20.04 上构建一个应用程序,其中 python3 指向 Python3.8,而我正在构建 aganist Python3.6
我在 WORKSPACE 的同一目录中有以下运行时。
$ cat BUILD.bazel
py_runtime(
name = "python3.6",
interpreter_path = "/usr/bin/python3.6",
)
我尝试通过运行以下命令来构建应用程序,而 bazel 仍然指向 python3,即 python3.8
bazelisk build company/app_api:app --python_top=//:python3.6
我也尝试了不推荐使用的选项,但也没有用。
bazelisk build company/app_api:app --python_path=/usr/bin/python3.6
这是我得到的错误:
...
subprocess.CalledProcessError: Command '['/usr/bin/python3', '-m', 'pip', '--isolated', 'wheel', '-r', '/source_code/src/python/third_party/requirements.txt']' returned non-zero exit status 1.
...
pip 正在尝试安装一个仅适用于 python3.6 的软件包,这就是它返回非零存在代码的原因。
如何强制 bazel 使用自定义 python 解释器?
解决方案
py_runtime
通常必须与py_runtime_pair
and一起使用toolchain
。请参阅文档中的示例。py_runtime_pair
该示例稍作修改以应用于 OP,如下所示:
load("@bazel_tools//tools/python:toolchain.bzl", "py_runtime_pair")
py_runtime(
name = "python3.6",
interpreter_path = "/usr/bin/python3.6",
python_version = "PY3",
)
py_runtime_pair(
name = "py3.6",
py3_runtime = ":python3.6",
)
toolchain(
name = "py3-tc",
toolchain = ":py3.6",
toolchain_type = "@bazel_tools//tools/python:toolchain_type",
)
然后可以通过放入文件或传递命令行标志来使用新的register_toolchains("//path/to/python3:py3-tc")
工具WORKSPACE
链--extra_toolchains //path/to/python3:py3-tc
。
将 python_interpreter 添加到 WORKSPACE 中的 pip_install 中。
pip_install(
requirements = "//third_party:requirements.txt",
python_interpreter = 'python3.6'
)
推荐阅读
- sql - 在 Postgres 中比较表和数组
- python - 为什么我的 for 循环会重写我正在循环的名称列表?
- r - 如何解决 tigris::call_geolocator() Internal Server Error (HTTP 500) 错误?
- python - 包含值的数据框不适用于“np.where”,并且存在 valueerror
- javascript - 反射器未定义 - three.js
- mysql - SQL“插入触发器后”抱怨字段列表中的未知列“currentId”,即游标
- javascript - 无论如何将API调用的json结果分配给javascript中的变量
- c# - Kendo MVC Grid 可编辑级联下拉菜单显示“未定义”
- mongodb - MongoDB 上的 Strapi:非结构化数据是否有内容类型?
- html - 如何将 JSON-LD 面包屑模式添加到我的网站导航以用于 SEO 目的