Spec-Zone.ru › Bazel 6.2

Правила 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)

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

Примеры

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.py, то ваше имя должно быть main.
deps

List of labels; optional

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

List of labels; required

Список исходных файлов, которые обрабатываются для создания целевого объекта. Это включает весь ваш исходный код и любые сгенерированные файлы. Целевые объекты библиотек должны указываться в 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"

Нужно ли создавать этот целевой объект (и его зависимости) для 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"

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

Этот атрибут объявляет, что цель 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 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-05-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.2.0/reference/be/python

Spec-Zone.ru

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