Spec-Zone.ru › Bazel 6.1

Правила 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 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 -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. Целевой объект и его runfiles будут добавлены в runfiles при включении отслеживания покрытия кода.

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

files

List of labels; optional

Для встроенного выполнения, это набор файлов, составляющих это выполнение. Эти файлы будут добавлены в runfiles бинарных файлов 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-03-15 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.1.0/reference/be/python

Spec-Zone.ru

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