Spec-Zone.ru › Bazel 6.4

Правила 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 всегда сбрасывается (возможно, по умолчанию) на ту версию, которая указана в этом атрибуте, независимо от версии, указанной в командной строке или другими вышестоящими целевыми файлами, зависящими от этого.

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

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

srcs_version

String; optional; default is "PY2AND3"

Этот атрибут объявляет совместимость целевого файла с 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"

Этот атрибут объявляет, что цель совместима с 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. Обратите внимание, что это работает даже в случае, если данная цель не была построена из-за конфликта версий.

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"

Этот атрибут объявляет, что цель совместима с 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

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-10-20 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.4.0/reference/be/python

Spec-Zone.ru

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