Skip to content

py_binary does not have runfiles created if called transitively through sh_binaryΒ #2664

@engnatha

Description

@engnatha

🐞 bug report

Affected Rule

This issue discusses the behavior of a py_binary target.

Is this a regression?

Haven't done a thorough search of past versions yet, but this does work correctly in bazel 6.4.0 and we are now seeing issues in bazel 7.5.0. During the switch, both systems were running rules_python version 0.37.0.

Description

When a py_binary is invoked, the backend will create the necessary <target>.runfiles directory that includes the relevant dependencies for running the target. There are cases in our system where it useful to wrap the calling of this py_binary behind a sh_binary as a data dependency. One such example is to make use of console scripts like flake8 in the repository as if they were installed in a virtual environment. If one uses the py_console_script_binary target directly, all supplied paths to lint must be absolute since the current working directory is modified by bazel when running the target. By changing the working directory, we can get the benefit of having hermetic tooling as a drop-in replacement for something normally provided in a virtual environment.

πŸ”¬ Minimal Reproduction

Attached a zip of a repro. Instructions to reproduce the behavior are in the README.

πŸ”₯ Exception or Error


Traceback (most recent call last):
  File "/home/nathanael/.cache/bazel/_bazel_nathanael/e616dc8a3f01de94997c692cfb80f031/execroot/_main/bazel-out/k8-fastbuild/bin/src/hello_world", line 580, in 
    Main()
  File "/home/nathanael/.cache/bazel/_bazel_nathanael/e616dc8a3f01de94997c692cfb80f031/execroot/_main/bazel-out/k8-fastbuild/bin/src/hello_world", line 471, in Main
    module_space = FindModuleSpace(main_rel_path)
  File "/home/nathanael/.cache/bazel/_bazel_nathanael/e616dc8a3f01de94997c692cfb80f031/execroot/_main/bazel-out/k8-fastbuild/bin/src/hello_world", line 181, in FindModuleSpace
    raise AssertionError('Cannot find .runfiles directory for %s' % sys.argv[0])
AssertionError: Cannot find .runfiles directory for /home/nathanael/.cache/bazel/_bazel_nathanael/e616dc8a3f01de94997c692cfb80f031/execroot/_main/bazel-out/k8-fastbuild/bin/src/hello_world

🌍 Your Environment

Operating System:

  
$ lsb_release -a
No LSB modules are available.
Distributor ID:	Ubuntu
Description:	Ubuntu 22.04.5 LTS
Release:	22.04
Codename:	jammy
(mono) ~/devel/rules_pyt
  

Output of bazel version:

  
bazel 7.5.0
  

Rules_python version:
0.37.0

rules_python_runfiles_repro-main.zip

  

  

Anything else relevant?

Thanks for making rules_python πŸ˜ƒ We're doing a lot of cool things with it!

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions