-
Notifications
You must be signed in to change notification settings - Fork 532
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
sys.path[0] breaks out of runfile tree. #382
Comments
Thanks for the report. This same problem is currently documented here bazelbuild/bazel#7091 but I cannot find a counterpart already in this project. The Python stub template has an example of a 'hack' to fix the problem https://github.com/bazelbuild/bazel/blob/master/src/main/java/com/google/devtools/build/lib/bazel/rules/python/python_stub_template.txt#L19. But that only fixes the problem in that python process, and the stub template starts the user's process and the problem is reintroduced like you observe. |
It seems like the stub template could use the https://docs.python.org/3/using/cmdline.html#cmdoption-s when it is building the command to execute: |
@person142, neither The problem will still exist because There are some potential solutions noted in the bazel issue:
I am unsure which would be the most appropriate in this case. I think 1 might not be trivial because IIUC the runfiles behaviour is part of core Bazel and not rules_python specific. |
This issue has been automatically marked as stale because it has not had any activity for 180 days. It will be closed if no further activity occurs in 30 days. |
This should probably be kept open since it's still a concern in the upstream issue |
In the latest python 3.11 beta there's a -P flag and |
See: bazelbuild/rules_python#382 Closes #15701. PiperOrigin-RevId: 462362643 Change-Id: I80fa61076e43153b2567b7ed68b3280722e85905
There are a couple issues when running pkgutil.get_data('apexer', 'mke2fs.conf') from a bazel-built apexer binary: - Soong will take the path to mke2fs.conf as being relative to the filegroup that included it, so mke2fs.conf ends up at the root of the python zip file, and next to apexer.py. Bazel doesn't do this, and instead keeps the mke2fs.conf file under a system/extras/ext4_utils folder. Use a genrule to explicitly copy mke2fs.conf to the current directory to work around this issue. - pkgutil.get_data() uses python's normal rules for locating modules in order to find where the file is. This means it will look through sys.path again to find the apexer module. Bazel currently has a bug where the first entry in sys.path is the location of apexer.py in the source tree, not in the runfiles directory. So pkgutil will find apexer.py there, and then start looking for mke2fs.conf next to it, and not find it. Work around this by deleting sys.path[0]. bazelbuild/rules_python#382 Bug: 204244290 Test: Presubmits Change-Id: I9fb9502bff2590abfde95f7f7cc9ebf31157836d
🐞 bug report
Affected Rule
py_binary
,py_test
.Is this a regression?
No
Description
When Python initializes it adds the directory of the script to the
sys.path
:This would imply that a
py
target such as{REPO_DIR}/bazel-bin/{target_path}/{target}.runfiles/{script_path}/{python_script}.py
would cause{REPO_DIR}/bazel-bin/{target_path}/{target}.runfiles/{script_path}/
to be inserted assys.path[0]
.However, because the script is a symlink to the real python script in the repository, Python follows the symlink and appends the actual underlying directory to
sys.path[0]
, in this case:{REPO_DIR}/{script_path}/
. This issue was raised in Python's bug tracker and noted as expected behaviour that won't be fixed issue17639.This allows the script to "break out" of the runfiles tree and import code from the same directory which it does not necessarily have access to via
src
ordeps
.This causes issues when creating multiple targets in the same directory which should not automatically depend on each other.
For example, given:
main
can depend onfoo
without the file being explicitly listed in the BUILD file.🔬 Minimal Reproduction
src/BUILD
src/main.py
src/foo.py
The output of
bazel run //src:main
will be:Which should not be possible where
foo.py
is not an input to//src:main
.🌍 Your Environment
Operating System:
Output of
bazel version
:Rules_python version:
Anything else relevant?
The most obvious solution that comes to mind for this would be to copy into the runfile tree rather than symlinking. It seems unlikely this is going to change upstream in Python.
The text was updated successfully, but these errors were encountered: