Как выбрать среду выполнения в 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?
3 ответа
py_runtime
обычно должен использоваться с и
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
флаг командной строки.
Если вы используете поддержку pip из bazelbuild / rules_python, то, вероятно, нет чистого способа сделать это, например, повторно использовать интерпретатор python из цепочки инструментов.python3
жестко запрограммирован в определении правила
Следуя документации, следующий пример должен работать с версией
3.6.0
. я думаю
bazel
просто не следует символическим ссылкам и возвращается к системной версии по умолчанию
python
.
py_runtime(
name = "python-3.6.0",
interpreter_path = "/opt/pyenv/versions/3.6.0/bin/python",
)
Вы также можете переопределить инструментальную цепочку Python, как описано здесь .