Spec-Zone.ru › Bazel 6.3

Правила 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 = [":testlib"],
)

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

Аргументы

Атрибуты
name

Name; required

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


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

List of labels; optional

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

List of labels; required

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

List of strings; optional

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

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

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

legacy_create_init

Integer; optional; default is -1

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

Label; optional

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

String; optional; nonconfigurable; default is "_INTERNAL_SENTINEL"

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

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

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

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

srcs_version

String; optional; default is "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

Integer; optional; default is -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

Name; required

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

deps

List of labels; optional

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

List of labels; optional

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

List of strings; optional

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

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

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

srcs_version

String; optional; default is "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

Name; required

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

deps

List of labels; optional

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

List of labels; required

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

List of strings; optional

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

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

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

legacy_create_init

Integer; optional; default is -1

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

Label; optional

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

String; optional; nonconfigurable; default is "_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

String; optional; default is "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

Integer; optional; default is 0

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

py_runtime

py_runtime(name, 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

Name; required

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

coverage_tool

Label; optional

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

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

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

files

List of labels; optional

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

Label; optional

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

String; optional

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

String; optional; default is "_INTERNAL_SENTINEL"

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

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

stub_shebang

String; optional; default is "#!/usr/bin/env python3"

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

См. вопрос 8685 для мотивации.

Не применяется к Windows.

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

Последнее обновление 2023-07-25 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/6.3.0/reference/be/python

Spec-Zone.ru

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