Skip to content

More compatible Bazel rules for running Python tools and building Python projects

License

Notifications You must be signed in to change notification settings

aspect-build/rules_py

Folders and files

NameName
Last commit message
Last commit date

Latest commit

55fd502 · Mar 6, 2025
Jan 24, 2025
Jan 24, 2025
Feb 13, 2025
Mar 6, 2025
Feb 13, 2025
Feb 20, 2025
Mar 6, 2025
Feb 29, 2024
Jan 23, 2025
Jun 24, 2024
Jun 7, 2024
Oct 23, 2024
Nov 22, 2024
Jan 23, 2025
Jan 24, 2025
Mar 4, 2022
Jan 24, 2025
Jan 27, 2025
Oct 3, 2024
Oct 24, 2024
Oct 24, 2024
Oct 24, 2024
Apr 15, 2022
Feb 20, 2025
Jan 28, 2025
Feb 20, 2025
Jan 28, 2025
Jan 27, 2025
Feb 15, 2024
Mar 5, 2024
Jan 28, 2025
Jan 28, 2025

Repository files navigation

Aspect's Bazel rules for Python

aspect_rules_py is a layer on top of rules_python, the standard Python ruleset hosted at https://github.com/bazelbuild/rules_python. The lower layer of rules_python is currently reused, dealing with the toolchain and dependencies.

However, this ruleset introduces a new implementation of py_library, py_binary, and py_test. Our philosophy is to behave more like idiomatic python ecosystem tools, where rules_python is closely tied to the way Google does Python development in their internal monorepo, google3. However we try to maintain compatibility with rules_python's rules for most use cases.

Layer Legacy Recommended
toolchain: fetch hermetic interpreter rules_python rules_python
pip.parse: fetch and install deps from pypi rules_python rules_python
gazelle: generate BUILD files rules_python aspect configure
rules: user-facing implementations rules_python rules_py

Learn about it

Aspect provides a Bazel training course based on rules_py: Bazel 102: Python

Watch Alex's talk from Monorepo World for a quick demo on how rules_py makes it easy to do Python with Bazel:

Python Monorepo World

Need help? This ruleset has support provided by https://aspect.dev.

Differences

We think you'll love rules_py because it fixes many issues with rules_python's rule implementations:

Note

What about the "starlarkification" effort in rules_python?

We think this is only useful within Google, because the semantics of the rules will remain identical. Even though the code will live in bazelbuild/rules_python rather than bazelbuild/bazel, it still cannot change without breaking Google-internal usage, and has all the ergonomic bugs above due to the way the runtime is stubbed.

Installation

Follow instructions from the release you wish to use: https://github.com/aspect-build/rules_py/releases

Using with Gazelle

In any ancestor BUILD file of the Python code, add these lines to instruct Gazelle to create rules_py variants of the py_* rules:

# gazelle:map_kind py_library py_library @aspect_rules_py//py:defs.bzl
# gazelle:map_kind py_binary py_binary @aspect_rules_py//py:defs.bzl
# gazelle:map_kind py_test py_test @aspect_rules_py//py:defs.bzl

Public API

Executables

  • py_binary an executable Python program, used with bazel run or as a tool.
  • py_test a Python program that executes a test runner such as unittest or pytest, to be used with bazel test.
  • py_venv create a virtualenv for a py_binary or py_test target for use outside Bazel, such as in an editor/IDE.

Packaging

  • py_pex_binary Create a zip file containing a full Python application.

Packages

  • py_library a unit of Python code, used as a dependency of other rules.