Reglas de Python

Informar un problema Ver el código fuente

Reglas

objeto_binario

Ver fuente de la regla
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)

Un py_binary es un programa ejecutable de Python que consiste en una colección de archivos de origen .py (posiblemente que pertenecen a otras reglas py_library), un árbol de directorios de *.runfiles que contiene todo el código y los datos que necesita el programa en el tiempo de ejecución, y una secuencia de comandos de stub que inicia el programa con el entorno y los datos iniciales correctos.

Ejemplos

py_binary(
    name = "foo",
    srcs = ["foo.py"],
    data = [":transform"],  # a cc_binary which we invoke at run time
    deps = [
        ":foolib",  # a py_library
    ],
)

Si deseas ejecutar un py_binary desde otro objeto binario o prueba (por ejemplo, ejecutar un objeto binario de Python para configurar algún recurso simulado desde dentro de una java_test), el enfoque correcto es hacer que el otro objeto binario o la prueba dependan del py_binary en su sección de datos. Luego, el otro objeto binario puede ubicar el objeto py_binary relacionado con el directorio de origen.

py_binary(
    name = "test_main",
    srcs = ["test_main.py"],
    deps = [":testing"],
)

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

Argumentos

Atributos
name

Name; required

Un nombre único para esta orientación.


Si no se especifica main, debe ser el mismo que el nombre del archivo de origen que es el punto de entrada principal de la aplicación, menos la extensión. Por ejemplo, si tu punto de entrada se llama main.py, tu nombre debería ser main.
deps

List of labels; optional

La lista de otras bibliotecas que se vincularán al destino binario. Consulta los comentarios generales sobre deps en Atributos típicos definidos por la mayoría de las reglas de compilación. Por lo general, son reglas py_library.
srcs

List of labels; required

La lista de archivos de origen (.py) que se procesan para crear el destino. Esto incluye todo el código que hayas registrado y los archivos de origen generados. En su lugar, los destinos de la biblioteca pertenecen a deps, mientras que otros archivos binarios necesarios para el tiempo de ejecución pertenecen a data.
imports

List of strings; optional

Lista de directorios de importación que se agregarán a PYTHONPATH.

Sujeto a la sustitución "Make variable". Estos directorios de importación se agregarán para esta regla y todas las reglas que dependan de ella (nota: no las reglas de las que depende esta regla). Cada directorio se agregará a PYTHONPATH por py_binary reglas que dependen de esta regla.

No se permiten las rutas de acceso absolutas (las que comienzan con /) y las que hacen referencia a una ruta por encima de la raíz de ejecución y generarán un error.

legacy_create_init

Integer; optional; default is -1

Establece de manera implícita la creación de archivos __init__.py vacíos en el árbol de runfiles. Estas se crean en todos los directorios que contienen el código fuente de Python o las bibliotecas compartidas, y en cada directorio superior de esos directorios, excepto el directorio raíz del repositorio. El valor predeterminado es automático, a menos que se use --incompatible_default_to_explicit_init_py. Si es falso, el usuario es responsable de crear (posiblemente vacío) archivos __init__.py y de agregarlos a los srcs de los destinos de Python según sea necesario.
main

Label; optional

El nombre del archivo de origen que es el punto de entrada principal de la aplicación. Este archivo también debe aparecer en srcs. Si no se especifica, se usa name en su lugar (consulta la sección anterior). Si name no coincide con ningún nombre de archivo en srcs, se debe especificar main.
python_version

String; optional; nonconfigurable; default is "_INTERNAL_SENTINEL"

Si se compila este destino (y su deps en tránsito) para Python 2 o Python 3. Los valores válidos son "PY2" y "PY3" (el valor predeterminado).

La versión de Python siempre se restablece (posiblemente de forma predeterminada) a la versión que especifique este atributo, independientemente de la versión especificada en la línea de comandos o de otros destinos superiores que dependan de esta.

Si deseas select() en la versión actual de Python, puedes inspeccionar el valor de @rules_python//python:python_version. Consulta aquí para obtener más información.

Advertencia de error: Este atributo establece la versión para la que Bazel compila el destino, pero debido a #4815, la secuencia de comandos de stub resultante aún puede invocar la versión de intérprete incorrecta en el entorno de ejecución. Consulta esta solución alternativa, que implica definir un destino py_runtime que apunte a una versión de Python según sea necesario y activar este py_runtime configurando --python_top.

srcs_version

String; optional; default is "PY2AND3"

Este atributo declara que el srcs del destino es compatible con Python 2, Python 3 o ambos. Para configurar la versión del entorno de ejecución de Python, usa el atributo python_version de una regla ejecutable de Python (py_binary o py_test).

Los valores permitidos son los siguientes: "PY2AND3", "PY2" y "PY3". Los valores "PY2ONLY" y "PY3ONLY" también se permiten por razones históricas, pero, en esencia, son los mismos que "PY2" y "PY3", y deben evitarse.

Ten en cuenta que solo las reglas ejecutables (py_binary y py_library ) en realidad verifican la versión actual de Python según el valor de este atributo. (Esta es una función; dado que py_library no cambia la versión actual de Python, si hiciera la validación, sería imposible compilar las bibliotecas PY2ONLY y PY3ONLY en la misma invocación). Además, si hay una discrepancia de versiones, el error solo se informa en la fase de ejecución. En particular, el error no aparecerá en una invocación bazel build --nobuild).

Para obtener información de diagnóstico sobre qué dependencias ingresan requisitos de versión, puedes ejecutar el aspecto de find_requirements en tu destino:

          bazel build <your target> \
              --aspects=@rules_python//python:defs.bzl%find_requirements \
              --output_groups=pyversioninfo
          
. Esto creará un archivo con el sufijo -pyversioninfo.txt que brinda información sobre los motivos por los que tu destino requiere una versión de Python o alguna otra. Ten en cuenta que funciona incluso si el destino determinado no se pudo compilar debido a un conflicto de versiones.

stamp

Integer; optional; default is -1

Indica si se debe codificar la información de compilación en el objeto binario. Valores posibles:
  • stamp = 1: Sella siempre la información de compilación en el objeto binario, incluso en compilaciones de --nostamp. Se debe evitar esta configuración, ya que podría terminar el almacenamiento en caché remoto para el objeto binario y cualquier acción descendente que dependa de él.
  • stamp = 0: Siempre reemplaza la información de compilación por valores constantes. Esto brinda un buen almacenamiento en caché de resultados de compilación.
  • stamp = -1: La marca --[no]stamp controla la incorporación de la información de compilación.

Los objetos binarios sellados no se vuelven a compilar, a menos que cambien sus dependencias.

biblioteca_py

Ver fuente de la regla
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)

Argumentos

Atributos
name

Name; required

Un nombre único para esta orientación.

deps

List of labels; optional

La lista de otras bibliotecas que se vincularán al destino binario. Consulta los comentarios generales sobre deps en Atributos típicos definidos por la mayoría de las reglas de compilación. Por lo general, son reglas py_library.
srcs

List of labels; optional

La lista de archivos de origen (.py) que se procesan para crear el destino. Esto incluye todo el código que hayas registrado y los archivos de origen generados.
imports

List of strings; optional

Lista de directorios de importación que se agregarán a PYTHONPATH.

Sujeto a la sustitución "Make variable". Estos directorios de importación se agregarán para esta regla y todas las reglas que dependan de ella (nota: no las reglas de las que depende esta regla). Cada directorio se agregará a PYTHONPATH por py_binary reglas que dependen de esta regla.

No se permiten las rutas de acceso absolutas (las que comienzan con /) y las que hacen referencia a una ruta por encima de la raíz de ejecución y generarán un error.

srcs_version

String; optional; default is "PY2AND3"

Este atributo declara que el srcs del destino es compatible con Python 2, Python 3 o ambos. Para configurar la versión del entorno de ejecución de Python, usa el atributo python_version de una regla ejecutable de Python (py_binary o py_test).

Los valores permitidos son los siguientes: "PY2AND3", "PY2" y "PY3". Los valores "PY2ONLY" y "PY3ONLY" también se permiten por razones históricas, pero, en esencia, son los mismos que "PY2" y "PY3", y deben evitarse.

Ten en cuenta que solo las reglas ejecutables (py_binary y py_library ) en realidad verifican la versión actual de Python según el valor de este atributo. (Esta es una función; dado que py_library no cambia la versión actual de Python, si hiciera la validación, sería imposible compilar las bibliotecas PY2ONLY y PY3ONLY en la misma invocación). Además, si hay una discrepancia de versiones, el error solo se informa en la fase de ejecución. En particular, el error no aparecerá en una invocación bazel build --nobuild).

Para obtener información de diagnóstico sobre qué dependencias ingresan requisitos de versión, puedes ejecutar el aspecto de find_requirements en tu destino:

          bazel build <your target> \
              --aspects=@rules_python//python:defs.bzl%find_requirements \
              --output_groups=pyversioninfo
          
. Esto creará un archivo con el sufijo -pyversioninfo.txt que brinda información sobre los motivos por los que tu destino requiere una versión de Python o alguna otra. Ten en cuenta que funciona incluso si el destino determinado no se pudo compilar debido a un conflicto de versiones.

prueba_py

Ver fuente de la regla
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)

Una regla py_test() compila una prueba. Una prueba es un wrapper binario alrededor de un código de prueba.

Ejemplos

py_test(
    name = "runtest_test",
    srcs = ["runtest_test.py"],
    deps = [
        "//path/to/a/py/library",
    ],
)

También es posible especificar un módulo principal:

py_test(
    name = "runtest_test",
    srcs = [
        "runtest_main.py",
        "runtest_lib.py",
    ],
    main = "runtest_main.py",
)

Argumentos

Atributos
name

Name; required

Un nombre único para esta orientación.

deps

List of labels; optional

La lista de otras bibliotecas que se vincularán al destino binario. Consulta los comentarios generales sobre deps en Atributos típicos definidos por la mayoría de las reglas de compilación. Por lo general, son reglas py_library.
srcs

List of labels; required

La lista de archivos de origen (.py) que se procesan para crear el destino. Esto incluye todo el código que hayas registrado y los archivos de origen generados. En su lugar, los destinos de la biblioteca pertenecen a deps, mientras que otros archivos binarios necesarios para el tiempo de ejecución pertenecen a data.
imports

List of strings; optional

Lista de directorios de importación que se agregarán a PYTHONPATH.

Sujeto a la sustitución "Make variable". Estos directorios de importación se agregarán para esta regla y todas las reglas que dependan de ella (nota: no las reglas de las que depende esta regla). Cada directorio se agregará a PYTHONPATH por py_binary reglas que dependen de esta regla.

No se permiten las rutas de acceso absolutas (las que comienzan con /) y las que hacen referencia a una ruta por encima de la raíz de ejecución y generarán un error.

legacy_create_init

Integer; optional; default is -1

Establece de manera implícita la creación de archivos __init__.py vacíos en el árbol de runfiles. Estas se crean en todos los directorios que contienen el código fuente de Python o las bibliotecas compartidas, y en cada directorio superior de esos directorios, excepto el directorio raíz del repositorio. El valor predeterminado es automático, a menos que se use --incompatible_default_to_explicit_init_py. Si es falso, el usuario es responsable de crear (posiblemente vacío) archivos __init__.py y de agregarlos a los srcs de los destinos de Python según sea necesario.
main

Label; optional

El nombre del archivo de origen que es el punto de entrada principal de la aplicación. Este archivo también debe aparecer en srcs. Si no se especifica, se usa name en su lugar (consulta la sección anterior). Si name no coincide con ningún nombre de archivo en srcs, se debe especificar main.
python_version

String; optional; nonconfigurable; default is "_INTERNAL_SENTINEL"

Si se compila este destino (y su deps en tránsito) para Python 2 o Python 3. Los valores válidos son "PY2" y "PY3" (el valor predeterminado).

La versión de Python siempre se restablece (posiblemente de forma predeterminada) a la versión que especifique este atributo, independientemente de la versión especificada en la línea de comandos o de otros destinos superiores que dependan de esta.

Si deseas select() en la versión actual de Python, puedes inspeccionar el valor de @rules_python//python:python_version. Consulta aquí para obtener más información.

Advertencia de error: Este atributo establece la versión para la que Bazel compila el destino, pero debido a #4815, la secuencia de comandos de stub resultante aún puede invocar la versión de intérprete incorrecta en el entorno de ejecución. Consulta esta solución alternativa, que implica definir un destino py_runtime que apunte a una versión de Python según sea necesario y activar este py_runtime configurando --python_top.

srcs_version

String; optional; default is "PY2AND3"

Este atributo declara que el srcs del destino es compatible con Python 2, Python 3 o ambos. Para configurar la versión del entorno de ejecución de Python, usa el atributo python_version de una regla ejecutable de Python (py_binary o py_test).

Los valores permitidos son los siguientes: "PY2AND3", "PY2" y "PY3". Los valores "PY2ONLY" y "PY3ONLY" también se permiten por razones históricas, pero, en esencia, son los mismos que "PY2" y "PY3", y deben evitarse.

Ten en cuenta que solo las reglas ejecutables (py_binary y py_library ) en realidad verifican la versión actual de Python según el valor de este atributo. (Esta es una función; dado que py_library no cambia la versión actual de Python, si hiciera la validación, sería imposible compilar las bibliotecas PY2ONLY y PY3ONLY en la misma invocación). Además, si hay una discrepancia de versiones, el error solo se informa en la fase de ejecución. En particular, el error no aparecerá en una invocación bazel build --nobuild).

Para obtener información de diagnóstico sobre qué dependencias ingresan requisitos de versión, puedes ejecutar el aspecto de find_requirements en tu destino:

          bazel build <your target> \
              --aspects=@rules_python//python:defs.bzl%find_requirements \
              --output_groups=pyversioninfo
          
. Esto creará un archivo con el sufijo -pyversioninfo.txt que brinda información sobre los motivos por los que tu destino requiere una versión de Python o alguna otra. Ten en cuenta que funciona incluso si el destino determinado no se pudo compilar debido a un conflicto de versiones.

stamp

Integer; optional; default is 0

Consulta la sección sobre los argumentos py_binary(), excepto que el argumento de estampilla está configurado en 0 de forma predeterminada para las pruebas.

py_runtime

Ver fuente de la regla
py_runtime(name, bootstrap_template, compatible_with, coverage_tool, deprecation, distribs, features, files, interpreter, interpreter_path, licenses, python_version, restricted_to, stub_shebang, tags, target_compatible_with, testonly, visibility)

Representa un entorno de ejecución de Python que se usa para ejecutar el código de Python.

Un destino py_runtime puede representar un entorno de ejecución de la plataforma o un entorno de ejecución en la compilación. Un entorno de ejecución de la plataforma accede a un intérprete instalado por el sistema en una ruta conocida, mientras que un entorno de ejecución de compilación apunta a un objetivo ejecutable que actúa como intérprete. En ambos casos, un "intérprete" se refiere a cualquier secuencia de comandos ejecutable o wrapper que pueda ejecutar una secuencia de comandos de Python pasada en la línea de comandos y seguir las mismas convenciones que el intérprete de CPython estándar.

Un entorno de ejecución de plataforma es, por naturaleza, no hermético. Implica un requisito en la plataforma de destino para tener un intérprete ubicado en una ruta de acceso específica. Un entorno de ejecución en compilación puede ser hermético o no, según si apunta a un intérprete que se registró o a una secuencia de comandos wrapper que accede al intérprete del sistema.

Ejemplo:

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",
)

Argumentos

Atributos
name

Name; required

Un nombre único para esta orientación.

bootstrap_template

Label; optional; default is @bazel_tools//tools/python:python_bootstrap_template.txt

Anteriormente conocido como la "secuencia de comandos stub de Python", este es el punto de entrada a cada destino ejecutable de Python.
coverage_tool

Label; optional

Este es un objetivo que se debe usar para recopilar información de cobertura de código de los objetivos py_binary y py_test.

Si se establece, el destino debe producir un solo archivo o ser un objetivo ejecutable. La ruta al único archivo o el ejecutable si el objetivo es ejecutable determina el punto de entrada de la herramienta de cobertura de Python. El destino y sus runfiles se agregarán a los archivos de ejecución cuando se habilite la cobertura.

El punto de entrada de la herramienta debe ser cargado por un intérprete de Python (p.ej., un archivo .py o .pyc). Debe aceptar los argumentos de la línea de comandos de coverage.py, al menos, se incluyen los subcomandos run y lcov.

files

List of labels; optional

Para un entorno de ejecución en compilación, este es el conjunto de archivos que comprende este entorno de ejecución. Estos archivos se agregarán a los runfiles de los objetos binarios de Python que usan este entorno de ejecución. Para un entorno de ejecución de la plataforma, no se debe establecer este atributo.
interpreter

Label; optional

En el tiempo de ejecución de compilación, este es el destino que se debe invocar como intérprete. Para un entorno de ejecución de plataforma, este atributo no se debe establecer.
interpreter_path

String; optional

Para un entorno de ejecución de plataforma, esta es la ruta de acceso absoluta de un intérprete de Python en la plataforma de destino. Para un entorno de ejecución de compilación, no se debe establecer este atributo.
python_version

String; optional; default is "_INTERNAL_SENTINEL"

Si este entorno de ejecución es para Python versión 2 o 3 principal Los valores válidos son "PY2" y "PY3".

La marca --incompatible_py3_is_default controla el valor predeterminado. Sin embargo, en el futuro, este atributo será obligatorio y no tendrá valor predeterminado.

stub_shebang

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

Expresión “Shebang” antepuesta a la secuencia de comandos de arranque de Python que se usa cuando se ejecutan destinos py_binary.

Consulta el problema 8685 para obtener motivación.

No se aplica a Windows.