blob: 2a57c76846cc60faecf93fd0964fba70851c624e [file] [log] [blame] [view]
# 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,
# ...
)
```