# bazel-runfiles library

This is a Bazel Runfiles lookup library for Bazel-built Python binaries and tests.

Typical Usage
-------------

1.  Add the '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.

      py_binary(
          name = "my_binary",
          ...
          deps = [requirement("runfiles")],
      )

3.  Import the runfiles library.

      import runfiles  # not "from runfiles import runfiles"

4.  Create a Runfiles object and use rlocation to look up runfile paths:

      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 implementations based
    on the environment variables in os.environ. See `Create()` for more info.

    If you want to explicitly create a manifest- or directory-based
    implementations, you can do so as follows:

      r1 = runfiles.CreateManifestBased("path/to/foo.runfiles_manifest")

      r2 = runfiles.CreateDirectoryBased("path/to/foo.runfiles/")

    If you wnat to start subprocesses, and the subprocess can't automatically
    find the correct runfiles directory, you can explicitly set the right
    environment variables for them:

      import subprocess
      import runfiles

      r = runfiles.Create()
      env = {}
      ...
      env.update(r.EnvVars())
      p = subprocess.Popen([r.Rlocation("path/to/binary")], env, ...)