Reglas de Python

Reglas

py_binary

Ver la 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 consta de una colección de archivos fuente .py (que posiblemente pertenezcan a otras reglas py_library), un árbol de directorios *.runfiles que contiene todo el código y los datos que necesita el programa en el tiempo de ejecución, y un script de código auxiliar 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 archivo binario o prueba (por ejemplo, ejecutar un archivo binario de Python para configurar algún recurso simulado desde un java_test), el enfoque correcto es hacer que el otro archivo binario o prueba dependa del py_binary en su sección de datos. Luego, el otro archivo binario puede ubicar py_binary en relación 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

Nombre: Obligatorio

Es un nombre único para este destino.


Si no se especifica main, debe ser igual al nombre del archivo fuente que es el punto de entrada principal de la aplicación, sin la extensión. Por ejemplo, si tu punto de entrada se llama main.py, tu nombre debe ser main.
deps

Lista de etiquetas. El valor predeterminado es [].

Es 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 de py_library.
srcs

Lista de etiquetas; obligatoria

Es la lista de archivos fuente (.py) que se procesan para crear el destino. Esto incluye todo el código que se registró y todos los archivos fuente generados. Los destinos de la biblioteca pertenecen a deps, mientras que otros archivos binarios necesarios en el tiempo de ejecución pertenecen a data.
imports

Lista de cadenas; el valor predeterminado es []

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

Sujeto a la sustitución de "Crear 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 con las reglas de py_binary que dependen de esta regla.

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

legacy_create_init

Número entero; el valor predeterminado es -1

Indica si se deben crear de forma implícita archivos __init__.py vacíos en el árbol de archivos de ejecución. Se crean en todos los directorios que contienen código fuente de Python o bibliotecas compartidas, y en todos los directorios principales de esos directorios, excepto el directorio raíz del repo. El valor predeterminado, auto, significa verdadero, a menos que se use --incompatible_default_to_explicit_init_py. Si es falso, el usuario es responsable de crear archivos __init__.py (posiblemente vacíos) y agregarlos al srcs de los destinos de Python según sea necesario.
main

Etiqueta: El valor predeterminado es None.

Es el nombre del archivo fuente 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 imagen anterior). Si name no coincide con ningún nombre de archivo en srcs, se debe especificar main.
python_version

Cadena; no configurable; el valor predeterminado es "_INTERNAL_SENTINEL"

Indica si se debe compilar este destino (y su deps transitivo) 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 especifica este atributo, independientemente de la versión especificada en la línea de comandos o por otros destinos superiores que dependan de este.

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 tu destino, pero, debido a #4815, es posible que la secuencia de comandos de código auxiliar resultante invoque la versión incorrecta del intérprete en el tiempo de ejecución. Consulta esta solución alternativa, que implica definir un destino py_runtime que apunte a cualquiera de las versiones de Python según sea necesario y activar este py_runtime configurando --python_top.

srcs_version

Cadena. El valor predeterminado es "PY2AND3".

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

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

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

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

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

Número entero; el valor predeterminado es -1

Indica si se debe codificar la información de compilación en el archivo binario. Valores posibles:
  • stamp = 1: Siempre se incluye la información de compilación en el binario, incluso en las compilaciones de --nostamp. Se debe evitar este parámetro de configuración, ya que podría detener el almacenamiento en caché remoto del binario y cualquier acción posterior que dependa de él.
  • stamp = 0: Siempre reemplaza la información de compilación por valores constantes. Esto proporciona un buen almacenamiento en caché de los resultados de la compilación.
  • stamp = -1: La incorporación de información de compilación se controla con la marca --[no]stamp.

Los archivos binarios con marca de tiempo no se vuelven a compilar, a menos que cambien sus dependencias.

py_library

Ver la 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

Nombre: Obligatorio

Es un nombre único para este destino.

deps

Lista de etiquetas. El valor predeterminado es [].

Es 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 de py_library.
srcs

Lista de etiquetas. El valor predeterminado es [].

Es la lista de archivos fuente (.py) que se procesan para crear el destino. Esto incluye todo el código que se registró y todos los archivos fuente generados.
imports

Lista de cadenas; el valor predeterminado es []

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

Sujeto a la sustitución de "Crear 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 con las reglas de py_binary que dependen de esta regla.

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

srcs_version

Cadena. El valor predeterminado es "PY2AND3".

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

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

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

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

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

py_test

Ver la 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 algún 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

Nombre: Obligatorio

Es un nombre único para este destino.

deps

Lista de etiquetas. El valor predeterminado es [].

Es 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 de py_library.
srcs

Lista de etiquetas; obligatoria

Es la lista de archivos fuente (.py) que se procesan para crear el destino. Esto incluye todo el código que se registró y todos los archivos fuente generados. Los destinos de la biblioteca pertenecen a deps, mientras que otros archivos binarios necesarios en el tiempo de ejecución pertenecen a data.
imports

Lista de cadenas; el valor predeterminado es []

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

Sujeto a la sustitución de "Crear 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 con las reglas de py_binary que dependen de esta regla.

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

legacy_create_init

Número entero; el valor predeterminado es -1

Indica si se deben crear de forma implícita archivos __init__.py vacíos en el árbol de archivos de ejecución. Se crean en todos los directorios que contienen código fuente de Python o bibliotecas compartidas, y en todos los directorios principales de esos directorios, excepto el directorio raíz del repo. El valor predeterminado, auto, significa verdadero, a menos que se use --incompatible_default_to_explicit_init_py. Si es falso, el usuario es responsable de crear archivos __init__.py (posiblemente vacíos) y agregarlos al srcs de los destinos de Python según sea necesario.
main

Etiqueta: El valor predeterminado es None.

Es el nombre del archivo fuente 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 imagen anterior). Si name no coincide con ningún nombre de archivo en srcs, se debe especificar main.
python_version

Cadena; no configurable; el valor predeterminado es "_INTERNAL_SENTINEL"

Indica si se debe compilar este destino (y su deps transitivo) 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 especifica este atributo, independientemente de la versión especificada en la línea de comandos o por otros destinos superiores que dependan de este.

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 tu destino, pero, debido a #4815, es posible que la secuencia de comandos de código auxiliar resultante invoque la versión incorrecta del intérprete en el tiempo de ejecución. Consulta esta solución alternativa, que implica definir un destino py_runtime que apunte a cualquiera de las versiones de Python según sea necesario y activar este py_runtime configurando --python_top.

srcs_version

Cadena. El valor predeterminado es "PY2AND3".

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

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

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

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

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

Número entero; el valor predeterminado es 0

Consulta la sección sobre los argumentos de py_binary(), excepto que el argumento de sello se establece en 0 de forma predeterminada para las pruebas.

py_runtime

Ver la 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 código de Python.

Un destino py_runtime puede representar un entorno de ejecución de la plataforma o un entorno de ejecución integrado. Un tiempo de ejecución de la plataforma accede a un intérprete instalado en el sistema en una ruta conocida, mientras que un tiempo de ejecución integrado apunta a un destino ejecutable que actúa como intérprete. En ambos casos, un "intérprete" significa cualquier secuencia de comandos de wrapper o binario ejecutable que sea capaz de ejecutar una secuencia de comandos de Python que se pase en la línea de comandos, siguiendo las mismas convenciones que el intérprete estándar de CPython.

Por su naturaleza, un tiempo de ejecución de la plataforma no es hermético. Impone un requisito en la plataforma de destino para que tenga un intérprete ubicado en una ruta específica. Un tiempo de ejecución integrado puede ser hermético o no, según si apunta a un intérprete registrado o a una secuencia de comandos de 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

Nombre: Obligatorio

Es un nombre único para este destino.

bootstrap_template

Etiqueta: El valor predeterminado es "@bazel_tools//tools/python:python_bootstrap_template.txt".

Anteriormente, se denominaba "secuencia de comandos de Python"; es el punto de entrada a cada destino ejecutable de Python.
coverage_tool

Etiqueta: El valor predeterminado es None.

Es un destino que se usa para recopilar información de cobertura del código de los destinos py_binary y py_test.

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

Un intérprete de Python debe poder cargar el punto de entrada de la herramienta (p.ej., un archivo .py o .pyc). Debe aceptar los argumentos de la línea de comandos de coverage.py, incluidos al menos los subcomandos run y lcov.

files

Lista de etiquetas. El valor predeterminado es [].

En el caso de un entorno de ejecución integrado en la compilación, este es el conjunto de archivos que lo componen. Estos archivos se agregarán a los archivos ejecutables de los archivos binarios de Python que usen este entorno de ejecución. Para un tiempo de ejecución de la plataforma, este atributo no debe establecerse.
interpreter

Etiqueta: El valor predeterminado es None.

Para un tiempo de ejecución integrado en la compilación, este es el destino que se invocará como intérprete. Para un tiempo de ejecución de la plataforma, este atributo no debe establecerse.
interpreter_path

Cadena. El valor predeterminado es "".

En el caso de un tiempo de ejecución de la plataforma, esta es la ruta de acceso absoluta de un intérprete de Python en la plataforma de destino. Para un tiempo de ejecución integrado, este atributo no debe establecerse.
python_version

Cadena. El valor predeterminado es "_INTERNAL_SENTINEL".

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

El valor predeterminado se controla con la marca --incompatible_py3_is_default. Sin embargo, en el futuro, este atributo será obligatorio y no tendrá un valor predeterminado.

stub_shebang

Cadena. El valor predeterminado es "#!/usr/bin/env python3".

Expresión "shebang" antepuesta a la secuencia de comandos de Python de arranque que se usa cuando se ejecutan destinos py_binary.

Consulta el problema 8685 para conocer la motivación.

No se aplica a Windows.