| # bazel-runfiles library | |
| This is a Bazel Runfiles lookup library for Bazel-built Python binaries and tests. | |
| Learn about runfiles: read [Runfiles guide](https://bazel.build/extending/rules#runfiles) | |
| or watch [Fabian's BazelCon talk](https://www.youtube.com/watch?v=5NbgUMH1OGo). | |
| ## Importing | |
| The Runfiles API is available from two sources, a direct Bazel target, and a [pypi](https://pypi.org/) package. | |
| ## Pure Bazel imports | |
| 1. Depend on this runfiles library from your build rule, like you would other third-party libraries: | |
| ```python | |
| py_binary( | |
| name = "my_binary", | |
| # ... | |
| deps = ["@rules_python//python/runfiles"], | |
| ) | |
| ``` | |
| 2. Import the runfiles library: | |
| ```python | |
| from python.runfiles import Runfiles | |
| ``` | |
| ## Pypi imports | |
| 1. Add the 'bazel-runfiles' dependency along with other third-party dependencies, for example in your `requirements.txt` file. | |
| 2. Depend on this runfiles library from your build rule, like you would other third-party libraries: | |
| ```python | |
| load("@pip_deps//:requirements.bzl", "requirement") | |
| py_binary( | |
| name = "my_binary", | |
| ... | |
| deps = [requirement("bazel-runfiles")], | |
| ) | |
| ``` | |
| 3. Import the runfiles library: | |
| ```python | |
| from runfiles import Runfiles | |
| ``` | |
| ## Typical Usage | |
| Create a `Runfiles` object and use `Rlocation` to look up runfile paths: | |
| ```python | |
| r = Runfiles.Create() | |
| # ... | |
| with open(r.Rlocation("my_workspace/path/to/my/data.txt"), "r") as f: | |
| contents = f.readlines() | |
| # ... | |
| ``` | |
| Here `my_workspace` is the name you specified via `module(name = "...")` in your `MODULE.bazel` file (with `--enable_bzlmod`, default as of Bazel 7) or `workspace(name = "...")` in `WORKSPACE` (with `--noenable_bzlmod`). | |
| The code above creates a manifest- or directory-based implementation based on | |
| the environment variables in `os.environ`. See `Runfiles.Create()` for more | |
| info. | |
| Alternatively, `Runfiles.CreateOrRaise()` can be used to raise an error | |
| instead of returning `None` if runfiles cannot be found: | |
| ```python | |
| r = Runfiles.CreateOrRaise() | |
| ``` | |
| If you want to explicitly create a manifest- or directory-based | |
| implementation, you can do so as follows: | |
| ```python | |
| r1 = Runfiles.CreateManifestBased("path/to/foo.runfiles_manifest") | |
| r2 = Runfiles.CreateDirectoryBased("path/to/foo.runfiles/") | |
| ``` | |
| If you want to start subprocesses that access runfiles, you have to set the right environment variables for them: | |
| ```python | |
| import subprocess | |
| from python.runfiles import Runfiles | |
| r = Runfiles.Create() | |
| env = {} | |
| # ... | |
| env.update(r.EnvVars()) | |
| p = subprocess.run( | |
| [r.Rlocation("path/to/binary")], | |
| env=env, | |
| # ... | |
| ) | |
| ``` |