:::{default-domain} bzl ::: # How to get the current Python version This guide explains how to use a [toolchain](toolchains) to get the current Python version and, as an example, write it to a file. You can create a simple rule that accesses the Python toolchain and retrieves the version string. ## The rule implementation Create a file named `my_rule.bzl`: ```starlark # my_rule.bzl def _my_rule_impl(ctx): toolchain = ctx.toolchains["@rules_python//python:toolchain_type"] info = toolchain.py3_runtime.interpreter_version_info python_version = str(info.major) + "." + str(info.minor) + "." + str(info.micro) output_file = ctx.actions.declare_file(ctx.attr.name + ".txt") ctx.actions.write( output = output_file, content = python_version, ) return [DefaultInfo(files = depset([output_file]))] my_rule = rule( implementation = _my_rule_impl, attrs = {}, toolchains = ["@rules_python//python:toolchain_type"], ) ``` The `info` variable above is a {obj}`PyRuntimeInfo` object, which contains information about the Python runtime. It contains more than just the version; see the {obj}`PyRuntimeInfo` docs for its API documentation. ## Using the rule In your `BUILD.bazel` file, you can use the rule like this: ```starlark # BUILD.bazel load(":my_rule.bzl", "my_rule") my_rule( name = "show_python_version", ) ``` When you build this target, it will generate a file named `show_python_version.txt` containing the Python version (e.g., `3.9`). ```starlark bazel build :show_python_version cat bazel-bin/show_python_version.txt ```