| # 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() |
| # ... |
| ``` |
| |
| The code above creates a manifest- or directory-based implementation based on the environment variables in `os.environ`. See `Runfiles.Create()` for more info. |
| |
| 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, and the subprocess can't automatically |
| find the correct runfiles directory, you can explicitly 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, |
| # ... |
| ) |
| ``` |