Spec-Zone.ru › Bazel 6.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 = [":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 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. Цель и её файлы будут добавлены в файлы при включении покрытия.

Точка входа для инструмента должна загружаться интерпретатором 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 и/или ее дочерних компаний.

Последнее обновление 2022-12-19 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.0.0/reference/be/python

Spec-Zone.ru

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