Spec-Zone.ru › Bazel 7.0

Правила Python

Правила

  • py_binary
  • py_library
  • py_test
  • py_runtime

py_binary

py_binary(name, deps, srcs, data, args, compatible_with, deprecation, distribs, env, exec_compatible_with, exec_properties, features, imports, legacy_create_init, licenses, main, output_licenses, python_version, restricted_to, srcs_version, stamp, tags, target_compatible_with, testonly, toolchains, visibility)

A py_binary — это исполняемая программа Python, состоящая из набора .py исходных файлов (возможно, принадлежащих другим py_library правилам), дерева каталогов *.runfiles содержащего весь код и данные, необходимые программе во время выполнения, и скрипта-заглушки, который запускает программу с правильной начальной средой и данными.

Примеры

py_binary(
    name = "foo",
    srcs = ["foo.py"],
    data = [":transform"],  # a cc_binary which we invoke at run time
    deps = [
        ":foolib",  # a py_library
    ],
)

Если вы хотите запустить py_binary из другой двоичной программы или теста (например, запустить python-бинарник для создания некоторого эмулируемого ресурса внутри java_test), то правильный подход — заставить другую двоичную программу или тест зависеть от py_binary в его разделе данных. Затем другая двоичная программа сможет найти py_binary относительно каталога исходных кодов.

py_binary(
    name = "test_main",
    srcs = ["test_main.py"],
    deps = [":testing"],
)

java_library(
    name = "testing",
    srcs = glob(["*.java"]),
    data = [":test_main"]
)

Аргументы

Атрибуты
name

Имя; обязательно

Уникальное имя для этой цели.


Если main не указано, оно должно совпадать с именем исходного файла, являющегося основной точкой входа приложения, без расширения. Например, если ваша точка входа называется main.py, то ваше имя должно быть main.
deps

Список меток; по умолчанию []

Список других библиотек, которые нужно подключить к целевой двоичной программе. Смотрите общие комментарии о deps в Типичные атрибуты, определяемые большинством правил сборки. Как правило, это правила py_library.
srcs

Список меток; обязательно

Список исходных (.py) файлов, которые обрабатываются для создания целевого объекта. Это включает весь ваш проверенный код и любые сгенерированные исходные файлы. Цели библиотек должны быть помещены в deps, а другие двоичные файлы, необходимые во время выполнения, должны быть помещены в data.
imports

Список строк; по умолчанию []

Список каталогов импорта, которые нужно добавить к PYTHONPATH.

Подлежит замене с помощью "Переменной Make". Эти каталоги импорта будут добавлены для данного правила и для всех правил, зависящих от него (обратите внимание: не для правил, от которых зависит данное правило. Каждый каталог будет добавлен к PYTHONPATH правилами py_binary, которые зависят от данного правила.

Абсолютные пути (пути, начинающиеся с /) и пути, ссылающиеся на путь выше корневого каталога исполнения, не допускаются и приведут к ошибке.

legacy_create_init

Целое число; по умолчанию -1

Нужно ли неявно создавать пустые файлы __init__.py в дереве runfiles. Они создаются в каждом каталоге, содержащем исходный код Python или общие библиотеки, и в каждом родительском каталоге этих каталогов, за исключением корневого каталога репозитория. По умолчанию auto означает true, если не используется --incompatible_default_to_explicit_init_py. Если false, пользователь отвечает за создание (возможно, пустых) файлов __init__.py и добавление их в srcs правил Python по мере необходимости.
main

Метка; по умолчанию None

Имя исходного файла, являющегося основной точкой входа приложения. Этот файл также должен быть перечислен в srcs. Если не указано, вместо него используется name (см. выше). Если name не соответствует имени файла в srcs, необходимо указать main .
python_version

Строка; неконфигурируемый; по умолчанию "_INTERNAL_SENTINEL"

Необходимо ли создавать этот объект (и его транзитивные deps) для Python 2 или Python 3. Допустимые значения "PY2" и "PY3" (по умолчанию).

Версия Python всегда сбрасывается (возможно, по умолчанию) до версии, указанной в этом атрибуте, независимо от версии, указанной в командной строке или другими вышестоящими объектами, зависящими от этого.

Если вы хотите select() текущую версию Python, вы можете проверить значение @rules_python//python:python_version. См. здесь за дополнительной информацией.

Предупреждение об ошибке: Этот атрибут устанавливает версию, для которой Bazel создает вашу цель, но из-за #4815, результирующий скрипт-заглушка может все еще вызывать неправильную версию интерпретатора во время выполнения. См. это исправление, которое включает определение целевого объекта py_runtime, указывающего на необходимую версию Python, и активацию этого py_runtime путем установки --python_top.

srcs_version

Строка; по умолчанию "PY2AND3"

Этот атрибут объявляет, что цель совместима с Python 2, Python 3 или обоими. Чтобы фактически установить версию Python runtime, используйте атрибут python_version исполняемого правила Python (py_binary или py_test).

Допустимые значения: "PY2AND3", "PY2", и "PY3". Значения "PY2ONLY" и "PY3ONLY" также разрешены по историческим причинам, но они в основном эквивалентны "PY2" и "PY3" и следует избегать.

Обратите внимание, что только исполняемые правила (py_binary и py_library ) фактически проверяют текущую версию Python на соответствие значению этого атрибута. (Это функция; так как py_library не изменяет текущую версию Python, если бы она выполняла проверку, было бы невозможно собрать как PY2ONLY так и PY3ONLY библиотеки в одном вызове.) Кроме того, если существует несоответствие версий, ошибка сообщается только на этапе выполнения. В частности, ошибка не появится в вызове bazel build --nobuild.

Чтобы получить диагностическую информацию о том, какие зависимости вводят требования к версиям, можно запустить аспект find_requirements на вашей цели:

          bazel build <your target> \
              --aspects=@rules_python//python:defs.bzl%find_requirements \
              --output_groups=pyversioninfo
          
Это создаст файл с расширением -pyversioninfo.txt, содержащий информацию о том, почему ваша цель требует определенной версии Python. Обратите внимание, что это работает даже если данная цель не удалось собрать из-за конфликта версий.
stamp

Целое число; по умолчанию -1

Нужно ли встраивать информацию о сборке в двоичный файл. Возможные значения:
  • stamp = 1: Всегда встраивать информацию о сборке в двоичный файл, даже в сборках --nostamp. Этот параметр следует избегать, поскольку он потенциально убивает кэширование удаленных данных для двоичного файла и любых последующих действий, которые зависят от него.
  • stamp = 0: Всегда заменять информацию о сборке постоянными значениями. Это обеспечивает хорошее кэширование результатов сборки.
  • stamp = -1: Встраивание информации о сборке контролируется флагом --[no]stamp.

Запечатанные двоичные файлы не перестраиваются, если их зависимости не изменились.

py_library

py_library(name, deps, srcs, data, compatible_with, deprecation, distribs, exec_compatible_with, exec_properties, features, imports, licenses, restricted_to, srcs_version, tags, target_compatible_with, testonly, visibility)

Аргументы

Атрибуты
name

Имя; обязательно

Уникальное имя для этой цели.

deps

Список меток; значение по умолчанию []

Список других библиотек, которые следует связать с двоичной целью. См. общие комментарии по deps в Типичные атрибуты, определённые большинством правил построения. Обычно это правила py_library.
srcs

Список меток; значение по умолчанию []

Список файлов исходного кода (.py) которые обрабатываются для создания цели. Это включает весь ваш код, хранящийся в системе контроля версий, и любые сгенерированные исходные файлы.
imports

Список строк; значение по умолчанию []

Список директорий импорта, которые необходимо добавить в PYTHONPATH.

Подлежит замене по "Переменным make". Эти директории импорта будут добавлены для этого правила и для всех правил, которые зависят от него (обратите внимание: не правила, от которых зависит это правило. Каждая директория будет добавлена в PYTHONPATH правилами py_binary, которые зависят от этого правила.

Абсолютные пути (пути, начинающиеся с /) и пути, которые ссылаются на путь выше корня выполнения, не допускаются и приведут к ошибке.

srcs_version

Строка; значение по умолчанию "PY2AND3"

Этот атрибут объявляет, что цель srcs совместима с Python 2, Python 3 или обоими. Для фактического задания версии интерпретатора Python используйте атрибут python_version исполняемого Python-правила (py_binary или py_test).

Допустимые значения: "PY2AND3", "PY2", и "PY3". Значения "PY2ONLY" и "PY3ONLY" также разрешены по историческим причинам, но они в основном эквивалентны "PY2" и "PY3" и следует избегать.

Обратите внимание, что только исполняемые правила (py_binary и py_library ) фактически проверяют текущую версию Python по отношению к значению этого атрибута. (Это особенность; поскольку py_library не изменяет текущую версию Python, если бы он проводил проверку, было бы невозможно построить обе библиотеки PY2ONLY и PY3ONLY в одном вызове). Кроме того, если есть несоответствие версий, ошибка сообщается только на этапе выполнения. В частности, ошибка не появится в вызове bazel build --nobuild).

Для получения диагностической информации о том, какие зависимости вводят требования к версиям, вы можете запустить аспект find_requirements для вашей цели:

          bazel build <your target> \
              --aspects=@rules_python//python:defs.bzl%find_requirements \
              --output_groups=pyversioninfo
          
Это создаст файл с суффиксом -pyversioninfo.txt, содержащий информацию о том, почему ваша цель требует определённой версии Python. Обратите внимание, что это работает даже если данная цель не была построена из-за конфликта версий.

py_test

py_test(name, deps, srcs, data, args, compatible_with, deprecation, distribs, env, env_inherit, exec_compatible_with, exec_properties, features, flaky, imports, legacy_create_init, licenses, local, main, python_version, restricted_to, shard_count, size, srcs_version, stamp, tags, target_compatible_with, testonly, timeout, toolchains, visibility)

Правило py_test() компилирует тест. Тест — это бинарная оболочка вокруг некоторого тестового кода.

Примеры

py_test(
    name = "runtest_test",
    srcs = ["runtest_test.py"],
    deps = [
        "//path/to/a/py/library",
    ],
)

Также можно указать основной модуль:

py_test(
    name = "runtest_test",
    srcs = [
        "runtest_main.py",
        "runtest_lib.py",
    ],
    main = "runtest_main.py",
)

Аргументы

Атрибуты
name

Имя; обязательно

Уникальное имя для этой цели.

deps

Список меток; значение по умолчанию []

Список других библиотек, которые следует связать с двоичной целью. См. общие комментарии по deps в Типичные атрибуты, определённые большинством правил построения. Обычно это правила py_library.
srcs

Список меток; обязательно

Список файлов исходного кода (.py) которые обрабатываются для создания цели. Это включает весь ваш код, хранящийся в системе контроля версий, и любые сгенерированные исходные файлы. Цели библиотек должны быть в deps, а другие двоичные файлы, необходимые во время выполнения, — в data.
imports

Список строк; значение по умолчанию []

Список директорий импорта, которые необходимо добавить в PYTHONPATH.

Подлежит замене по "Переменным make". Эти директории импорта будут добавлены для этого правила и для всех правил, которые зависят от него (обратите внимание: не правила, от которых зависит это правило. Каждая директория будет добавлена в PYTHONPATH правилами py_binary, которые зависят от этого правила.

Абсолютные пути (пути, начинающиеся с /) и пути, которые ссылаются на путь выше корня выполнения, не допускаются и приведут к ошибке.

legacy_create_init

Целое число; значение по умолчанию -1

Нужно ли неявно создавать пустые файлы __init__.py в дереве runfiles. Они создаются в каждой директории, содержащей исходный код Python или общие библиотеки, и в каждой родительской директории этих директорий, за исключением директории корня репозитория. Значение по умолчанию, auto, означает true, если не используется --incompatible_default_to_explicit_init_py. Если false, пользователь отвечает за создание (возможно, пустых) файлов __init__.py и добавление их в srcs целей Python по мере необходимости.
main

Метка; значение по умолчанию None

Имя файла исходного кода, являющегося основной точкой входа приложения. Этот файл также должен быть перечислен в srcs. Если не указано, используется name (см. выше). Если name не соответствует ни одному имени файла в srcs, необходимо указать main.
python_version

Строка; не настраиваемый; значение по умолчанию "_INTERNAL_SENTINEL"

Нужно ли строить эту цель (и её транзитивные deps ) для Python 2 или Python 3. Допустимые значения "PY2" и "PY3" (значение по умолчанию).

Версия Python всегда сбрасывается (возможно, по умолчанию) на ту версию, которая указана в этом атрибуте, независимо от версии, указанной в командной строке или другими более высокими целями, которые зависят от этой.

Если вы хотите select() текущую версию Python, вы можете проверить значение @rules_python//python:python_version. См. здесь для получения дополнительной информации.

Предупреждение об ошибке: Этот атрибут устанавливает версию, для которой Bazel строит вашу цель, но из-за #4815, результирующий скрипт-заглушка может по-прежнему вызывать неправильную версию интерпретатора при выполнении. См. этот обходной путь, который предполагает определение цели py_runtime, указывающей на нужную версию Python, и активацию этой py_runtime путём установки --python_top.

srcs_version

Строка; значение по умолчанию "PY2AND3"

Этот атрибут объявляет, что цель srcs совместима с Python 2, Python 3 или обоими. Для фактического задания версии интерпретатора Python используйте атрибут python_version исполняемого Python-правила (py_binary или py_test).

Допустимые значения: "PY2AND3", "PY2", и "PY3". Значения "PY2ONLY" и "PY3ONLY" также разрешены по историческим причинам, но они в основном эквивалентны "PY2" и "PY3" и следует избегать.

Обратите внимание, что только исполняемые правила (py_binary и py_library ) фактически проверяют текущую версию Python по отношению к значению этого атрибута. (Это особенность; поскольку py_library не изменяет текущую версию Python, если бы он проводил проверку, было бы невозможно построить обе библиотеки PY2ONLY и PY3ONLY в одном вызове). Кроме того, если есть несоответствие версий, ошибка сообщается только на этапе выполнения. В частности, ошибка не появится в вызове bazel build --nobuild).

Для получения диагностической информации о том, какие зависимости вводят требования к версиям, вы можете запустить аспект find_requirements для вашей цели:

          bazel build <your target> \
              --aspects=@rules_python//python:defs.bzl%find_requirements \
              --output_groups=pyversioninfo
          
Это создаст файл с суффиксом -pyversioninfo.txt, содержащий информацию о том, почему ваша цель требует определённой версии Python. Обратите внимание, что это работает даже если данная цель не была построена из-за конфликта версий.
stamp

Целое число; значение по умолчанию 0

См. раздел по аргументам py_binary(), за исключением того, что аргумент stamp по умолчанию равен 0 для тестов.

py_runtime

py_runtime(name, bootstrap_template, compatible_with, coverage_tool, deprecation, distribs, features, files, interpreter, interpreter_path, licenses, python_version, restricted_to, stub_shebang, tags, target_compatible_with, testonly, visibility)

Представляет среду выполнения Python, используемую для выполнения Python-кода.

Цель py_runtime может представлять собой либо платформенную среду выполнения, либо встроенную среду выполнения. Платформенная среда выполнения обращается к установленной в системе интерпретатору по известному пути, тогда как встроенная среда выполнения указывает на исполняемый файл, который выступает в качестве интерпретатора. В обоих случаях "интерпретатор" означает любой исполняемый двоичный файл или скрипт-обёртку, способный запускать Python-скрипт, переданный в командной строке, соблюдая те же соглашения, что и стандартный интерпретатор CPython.

Платформенная среда выполнения по своей природе негерметична. Она требует от целевой платформы наличия интерпретатора по определённому пути. Встроенная среда выполнения может быть герметичной или нет, в зависимости от того, указывает ли она на интерпретатор, включённый в проект, или на скрипт-обёртку, обращаясь к системному интерпретатору.

Пример:

py_runtime(
    name = "python-2.7.12",
    files = glob(["python-2.7.12/**"]),
    interpreter = "python-2.7.12/bin/python",
)

py_runtime(
    name = "python-3.6.0",
    interpreter_path = "/opt/pyenv/versions/3.6.0/bin/python",
)

Аргументы

Атрибуты
name

Имя; обязательно

Уникальное имя для этой цели.

bootstrap_template

Метка; значение по умолчанию "@bazel_tools//tools/python:python_bootstrap_template.txt"

Ранее назывался "Python-скриптом-заглушкой", это точка входа для каждой целевой программы Python.
coverage_tool

Метка; значение по умолчанию None

Эта цель используется для сбора информации о покрытии кода из целей py_binary и py_test.

Если задано, цель должна либо генерировать единственный файл, либо быть исполняемой целью. Путь к единственному файлу или исполняемый файл (если цель исполняемая) определяет точку входа для инструмента python coverage. Цель и её файлы будут добавлены в файлы при включенном покрытии.

Точка входа для инструмента должна быть загружаемой интерпретатором Python (например, файл .py или .pyc). Он должен принимать аргументы командной строки из coverage.py, по крайней мере включая подкоманды run и lcov.

files

Список меток; значение по умолчанию []

Для встроенной среды выполнения это набор файлов, составляющих эту среду выполнения. Эти файлы будут добавлены в файлы среды выполнения Python-библиотек, использующих эту среду выполнения. Для платформенной среды выполнения этот атрибут устанавливать нельзя.
interpreter

Метка; значение по умолчанию None

Для встроенной среды выполнения это цель, которая вызывается в качестве интерпретатора. Для платформенной среды выполнения этот атрибут устанавливать нельзя.
interpreter_path

Строка; значение по умолчанию ""

Для платформенной среды выполнения это абсолютный путь к интерпретатору Python на целевой платформе. Для встроенной среды выполнения этот атрибут устанавливать нельзя.
python_version

Строка; значение по умолчанию "_INTERNAL_SENTINEL"

Указывает, предназначена ли эта среда выполнения для Python версии 2 или 3. Допустимые значения "PY2" и "PY3".

Значение по умолчанию определяется флагом --incompatible_py3_is_default. Однако в будущем этот атрибут будет обязательным и не будет иметь значения по умолчанию.

stub_shebang

Строка; значение по умолчанию "#!/usr/bin/env python3"

Выражение "Shebang", добавляемое в начало скрипта загрузки Python, используемого при выполнении целей py_binary.

См. задачу 8685 для мотивации.

Не применимо к Windows.

За исключением случаев, указанных в ином месте, содержимое этой страницы лицензировано по лицензии Creative Commons Attribution 4.0, а примеры кода — по лицензии Apache 2.0. Для получения подробностей см. Политики сайта Google для разработчиков. Java — зарегистрированный товарный знак Oracle и/или её дочерних компаний.

Последнее обновление 2023-12-11 UTC.

Licensed under the Creative Commons Attribution 4.0 License, and code samples are licensed under the Apache 2.0 License.
https://bazel.build/versions/7.0.0/reference/be/python

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API