//python:py_runtime_info.bzl

Public entry point for PyRuntimeInfo.

provider PyRuntimeInfo

Contains information about a Python runtime, as returned by the py_runtime rule.

Warning

This is an unstable public API. It may change more frequently and has weaker compatibility guarantees.

A Python runtime describes either a platform runtime or an in-build runtime. A platform runtime accesses a system-installed interpreter at a known path, whereas an in-build runtime points to a File that acts as the interpreter. In both cases, an “interpreter” is really any executable binary or wrapper script that is capable of running a Python script passed on the command line, following the same conventions as the standard CPython interpreter.

PyRuntimeInfo.<init>(abi_flags, bootstrap_template, coverage_files, coverage_tool, files, implementation_name, interpreter, interpreter_path, interpreter_version_info, pyc_tag, python_version, site_init_template, stage2_bootstrap_template, stub_shebang, supports_build_time_venv, zip_main_template)
PyRuntimeInfo.abi_flags: str

The runtime’s ABI flags, i.e. sys.abiflags.

Added in version 1.0.0.

PyRuntimeInfo.bootstrap_template: File

A template of code responsible for the initial startup of a program.

This code is responsible for:

  • Locating the target interpreter. Typically it is in runfiles, but not always.

  • Setting necessary environment variables, command line flags, or other configuration that can’t be modified after the interpreter starts.

  • Invoking the appropriate entry point. This is usually a second-stage bootstrap that performs additional setup prior to running a program’s actual entry point.

The --bootstrap_impl flag affects how this stage 1 bootstrap is expected to behave and the substutitions performed.

  • --bootstrap_impl=system_python substitutions: %is_zipfile%, %python_binary%, %target%, %workspace_name, %coverage_tool%, %import_all%, %imports%, %main%, %shebang%

  • --bootstrap_impl=script substititions: %is_zipfile%, %python_binary%, %python_binary_actual%, %target%, %workspace_name, %shebang%, %stage2_bootstrap%

Substitution definitions:

  • %shebang%: The shebang to use with the bootstrap; the bootstrap template may choose to ignore this.

  • %stage2_bootstrap%: A runfiles-relative path to the stage 2 bootstrap.

  • %python_binary%: The path to the target Python interpreter. There are three types of paths:

    • An absolute path to a system interpreter (e.g. begins with /).

    • A runfiles-relative path to an interpreter (e.g. somerepo/bin/python3)

    • A program to search for on PATH, i.e. a word without spaces, e.g. python3.

    When --bootstrap_impl=script is used, this is always a runfiles-relative path to a venv-based interpreter executable.

  • %python_binary_actual%: The path to the interpreter that %python_binary% invokes. There are three types of paths:

    • An absolute path to a system interpreter (e.g. begins with /).

    • A runfiles-relative path to an interpreter (e.g. somerepo/bin/python3)

    • A program to search for on PATH, i.e. a word without spaces, e.g. python3.

    Only set for zip builds with --bootstrap_impl=script; other builds will use an empty string.

  • %workspace_name%: The name of the workspace the target belongs to.

  • %is_zipfile%: The string 1 if this template is prepended to a zipfile to create a self-executable zip file. The string 0 otherwise.

For the other substitution definitions, see the stage2_bootstrap_template docs.

Changed in version 0.33.0: The set of substitutions depends on --bootstrap_impl

PyRuntimeInfo.coverage_files: depset[File] | None

The files required at runtime for using coverage_tool. Will be None if no coverage_tool was provided.

PyRuntimeInfo.coverage_tool: File | None

If set, this field is a File representing tool used for collecting code coverage information from python tests. Otherwise, this is None.

PyRuntimeInfo.files: depset[File] | None

If this is an in-build runtime, this field is a depset of Files that need to be added to the runfiles of an executable target that uses this runtime (in particular, files needed by interpreter). The value of interpreter need not be included in this field. If this is a platform runtime then this field is None.

PyRuntimeInfo.implementation_name: str | None

The Python implementation name (sys.implementation.name)

PyRuntimeInfo.interpreter: File | None

If this is an in-build runtime, this field is a File representing the interpreter. Otherwise, this is None. Note that an in-build runtime can use either a prebuilt, checked-in interpreter or an interpreter built from source.

PyRuntimeInfo.interpreter_path: str | None

If this is a platform runtime, this field is the absolute filesystem path to the interpreter on the target platform. Otherwise, this is None.

PyRuntimeInfo.interpreter_version_info: struct

Version information about the interpreter this runtime provides. It should match the format given by sys.version_info, however for simplicity, the micro, releaselevel, and serial values are optional. A struct with the following fields:

  • major: int, the major version number

  • minor: int, the minor version number

  • micro: int | None, the micro version number

  • releaselevel: str | None, the release level

  • serial: int | None, the serial number of the release

PyRuntimeInfo.pyc_tag: str | None

The tag portion of a pyc filename, e.g. the cpython-39 infix of foo.cpython-39.pyc. See PEP 3147. If not specified, it will be computed from implementation_name and interpreter_version_info. If no pyc_tag is available, then only source-less pyc generation will function correctly.

PyRuntimeInfo.python_version: str

Indicates whether this runtime uses Python major version 2 or 3. Valid values are (only) "PY2" and "PY3".

PyRuntimeInfo.site_init_template: File

The template to use for the binary-specific site-init hook run by the interpreter at startup.

Added in version 1.0.0.

PyRuntimeInfo.stage2_bootstrap_template: File

A template of Python code that runs under the desired interpreter and is responsible for orchestrating calling the program’s actual main code. This bootstrap is responsible for affecting the current runtime’s state, such as import paths or enabling coverage, so that, when it runs the program’s actual main code, it works properly under Bazel.

The following substitutions are made during template expansion:

  • %main%: A runfiles-relative path to the program’s actual main file. This can be a .py or .pyc file, depending on precompile settings.

  • %coverage_tool%: Runfiles-relative path to the coverage library’s entry point. If coverage is not enabled or available, an empty string.

  • %import_all%: The string True if all repositories in the runfiles should be added to sys.path. The string False otherwise.

  • %imports%: A colon-delimited string of runfiles-relative paths to add to sys.path.

  • %target%: The name of the target this is for.

  • %workspace_name%: The name of the workspace the target belongs to.

Added in version 0.33.0.

PyRuntimeInfo.stub_shebang: str

“Shebang” expression prepended to the bootstrapping Python stub script used when executing py_binary targets. Does not apply to Windows.

PyRuntimeInfo.supports_build_time_venv: bool

True if this toolchain supports the build-time created virtual environment. False if not or unknown. If build-time venv creation isn’t supported, then binaries may fallback to non-venv solutions or creating a venv at runtime.

In order to use the build-time created virtual environment, a toolchain needs to meet two criteria:

  1. Specifying the underlying executable (e.g. /usr/bin/python3, as reported by sys._base_executable) for the venv executable ($venv/bin/python3, as reported by sys.executable). This typically requires relative symlinking the venv path to the underlying path at build time, or using the PYTHONEXECUTABLE environment variable (Python 3.11+) at runtime.

  2. Having the build-time created site-packages directory (<venv>/lib/python{version}/site-packages) recognized by the runtime interpreter. This typically requires the Python version to be known at build-time and match at runtime.

Added in version 1.5.0.

PyRuntimeInfo.zip_main_template: File

A template of Python code that becomes a zip file’s top-level __main__.py file. The top-level __main__.py file is used when the zip file is explicitly passed to a Python interpreter. See PEP 441 for more information about zipapp support. Note that py_binary-generated zip files are self-executing and skip calling __main__.py.

The following substitutions are made during template expansion:

  • %stage2_bootstrap%: A runfiles-relative string to the stage 2 bootstrap file.

  • %python_binary%: The path to the target Python interpreter. There are three types of paths:

    • An absolute path to a system interpreter (e.g. begins with /).

    • A runfiles-relative path to an interpreter (e.g. somerepo/bin/python3)

    • A program to search for on PATH, i.e. a word without spaces, e.g. python3.

  • %workspace_name%: The name of the workspace for the built target.

Added in version 0.33.0.