Как выбрать среду выполнения в 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, как описано здесь .

Другие вопросы по тегам