From 8159e21706dc01a281e3faf69b82dca93e69a5fe Mon Sep 17 00:00:00 2001 From: "Reid D. McKenzie" Date: Mon, 9 Jun 2025 18:21:35 -0600 Subject: [PATCH 1/6] tweak(venv): Use the interpreter to abspath --- py/tools/py/src/activate.tmpl | 20 +++++++++++++++++++- py/tools/py/src/runfiles_interpreter.tmpl | 2 +- 2 files changed, 20 insertions(+), 2 deletions(-) diff --git a/py/tools/py/src/activate.tmpl b/py/tools/py/src/activate.tmpl index 06e17477..5dbd72bb 100644 --- a/py/tools/py/src/activate.tmpl +++ b/py/tools/py/src/activate.tmpl @@ -70,7 +70,7 @@ export PYTHONEXECUTABLE # unset PYTHONHOME if set # this will fail if PYTHONHOME is set to the empty string (which is bad anyway) # could use `if (set -u; : $PYTHONHOME) ;` in bash. -_OLD_VIRTUAL_PYTHONHOME="${PYTHONHOME:-}" +_OLD_VIRTUAL_PYTHONHOME="${PYTHONHOME:-_activate_undef}" unset PYTHONHOME _OLD_VIRTUAL_PATH="$PATH" @@ -85,6 +85,24 @@ _OLD_VIRTUAL_PATH="$PATH" # can provide some fallback handling around runfiles too. {{RUNFILES_INTERPRETER}} +_abspath() { + "${PYTHONEXECUTABLE}" -c 'import os, sys; print(os.path.abspath(sys.argv[1]))' "$@" +} + +# Re-export abspath'd vars +# This allows us to avoid relative path issues without incurring sandbox escapes +VIRTUAL_ENV="$(_abspath "${VIRTUAL_ENV}")" +export VIRTUAL_ENV + +PYTHONEXECUTABLE="$(_abspath "${PYTHONEXECUTABLE}")" +export PYTHONEXECUTABLE + +if [ -n "${PYTHONHOME:-}" ]; then + PYTHONHOME="$(_abspath "${PYTHONHOME}")" + export PYTHONHOME +fi + +# Now we can put the venv's absolute bin on the path PATH="$VIRTUAL_ENV/bin:$PATH" export PATH diff --git a/py/tools/py/src/runfiles_interpreter.tmpl b/py/tools/py/src/runfiles_interpreter.tmpl index f53de4f3..2ad061ba 100644 --- a/py/tools/py/src/runfiles_interpreter.tmpl +++ b/py/tools/py/src/runfiles_interpreter.tmpl @@ -1,4 +1,4 @@ -# --- Runfiles-based interpreter setup -- +# --- Runfiles-based interpreter setup --- # If the runfiles dir is unset AND we will fail to find a runfiles manifest # based on inspecting $0, we need to try something different. From eacb806f5a8eab8a5c38c2378f80b53bd63cc87d Mon Sep 17 00:00:00 2001 From: "Reid D. McKenzie" Date: Mon, 9 Jun 2025 18:32:41 -0600 Subject: [PATCH 2/6] Avoid capturing the trailing / --- py/tools/py/src/runfiles_interpreter.tmpl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/py/tools/py/src/runfiles_interpreter.tmpl b/py/tools/py/src/runfiles_interpreter.tmpl index 2ad061ba..1aea2ec7 100644 --- a/py/tools/py/src/runfiles_interpreter.tmpl +++ b/py/tools/py/src/runfiles_interpreter.tmpl @@ -22,7 +22,7 @@ _activate_find_runfiles() { # find the manifest file and runfiles tree relative to the execroot. # HACK: We can't lazy-match to the first /bin/, so we have to manually count four groups - EXECROOT="$(echo "${1}" | sed 's/\(execroot\/[^\/]*\/[^\/]*\/[^\/]*\/[^\/]*\/\).*$/\1/' )" + EXECROOT="$(echo "${1}" | sed 's/\(execroot\/[^\/]*\/[^\/]*\/[^\/]*\/[^\/]*\).*$/\1/' )" export RUNFILES_DIR="${EXECROOT}/${RUNFILES_PATH}" elif [[ "${1}" == *.runfiles/* ]]; then # Examples: From a66c3f6200a448cce15be3b30f557375583323b2 Mon Sep 17 00:00:00 2001 From: "Reid D. McKenzie" Date: Mon, 9 Jun 2025 18:41:09 -0600 Subject: [PATCH 3/6] Update layer listings --- py/tests/py_venv_image_layer/my_app_amd64_layers_listing.yaml | 2 +- py/tests/py_venv_image_layer/my_app_arm64_layers_listing.yaml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/py/tests/py_venv_image_layer/my_app_amd64_layers_listing.yaml b/py/tests/py_venv_image_layer/my_app_amd64_layers_listing.yaml index 7bc78804..83d3add4 100644 --- a/py/tests/py_venv_image_layer/my_app_amd64_layers_listing.yaml +++ b/py/tests/py_venv_image_layer/my_app_amd64_layers_listing.yaml @@ -2510,7 +2510,7 @@ files: - drwxr-xr-x 0 0 0 0 Jan 1 2023 ./py/tests/py_venv_image_layer/my_app_bin.runfiles/aspect_rules_py/py/tests/py_venv_image_layer/ - drwxr-xr-x 0 0 0 0 Jan 1 2023 ./py/tests/py_venv_image_layer/my_app_bin.runfiles/aspect_rules_py/py/tests/py_venv_image_layer/.my_app_bin/ - drwxr-xr-x 0 0 0 0 Jan 1 2023 ./py/tests/py_venv_image_layer/my_app_bin.runfiles/aspect_rules_py/py/tests/py_venv_image_layer/.my_app_bin/bin/ - - -rwxr-xr-x 0 0 0 8099 Jan 1 2023 ./py/tests/py_venv_image_layer/my_app_bin.runfiles/aspect_rules_py/py/tests/py_venv_image_layer/.my_app_bin/bin/activate + - -rwxr-xr-x 0 0 0 8619 Jan 1 2023 ./py/tests/py_venv_image_layer/my_app_bin.runfiles/aspect_rules_py/py/tests/py_venv_image_layer/.my_app_bin/bin/activate - -rwxr-xr-x 0 0 0 817416 Jan 1 2023 ./py/tests/py_venv_image_layer/my_app_bin.runfiles/aspect_rules_py/py/tests/py_venv_image_layer/.my_app_bin/bin/python - -rwxr-xr-x 0 0 0 817416 Jan 1 2023 ./py/tests/py_venv_image_layer/my_app_bin.runfiles/aspect_rules_py/py/tests/py_venv_image_layer/.my_app_bin/bin/python3 - -rwxr-xr-x 0 0 0 817416 Jan 1 2023 ./py/tests/py_venv_image_layer/my_app_bin.runfiles/aspect_rules_py/py/tests/py_venv_image_layer/.my_app_bin/bin/python3.9 diff --git a/py/tests/py_venv_image_layer/my_app_arm64_layers_listing.yaml b/py/tests/py_venv_image_layer/my_app_arm64_layers_listing.yaml index 0a56adb5..0fb7f006 100644 --- a/py/tests/py_venv_image_layer/my_app_arm64_layers_listing.yaml +++ b/py/tests/py_venv_image_layer/my_app_arm64_layers_listing.yaml @@ -2491,7 +2491,7 @@ files: - drwxr-xr-x 0 0 0 0 Jan 1 2023 ./py/tests/py_venv_image_layer/my_app_bin.runfiles/aspect_rules_py/py/tests/py_venv_image_layer/ - drwxr-xr-x 0 0 0 0 Jan 1 2023 ./py/tests/py_venv_image_layer/my_app_bin.runfiles/aspect_rules_py/py/tests/py_venv_image_layer/.my_app_bin/ - drwxr-xr-x 0 0 0 0 Jan 1 2023 ./py/tests/py_venv_image_layer/my_app_bin.runfiles/aspect_rules_py/py/tests/py_venv_image_layer/.my_app_bin/bin/ - - -rwxr-xr-x 0 0 0 8100 Jan 1 2023 ./py/tests/py_venv_image_layer/my_app_bin.runfiles/aspect_rules_py/py/tests/py_venv_image_layer/.my_app_bin/bin/activate + - -rwxr-xr-x 0 0 0 8620 Jan 1 2023 ./py/tests/py_venv_image_layer/my_app_bin.runfiles/aspect_rules_py/py/tests/py_venv_image_layer/.my_app_bin/bin/activate - -rwxr-xr-x 0 0 0 698064 Jan 1 2023 ./py/tests/py_venv_image_layer/my_app_bin.runfiles/aspect_rules_py/py/tests/py_venv_image_layer/.my_app_bin/bin/python - -rwxr-xr-x 0 0 0 698064 Jan 1 2023 ./py/tests/py_venv_image_layer/my_app_bin.runfiles/aspect_rules_py/py/tests/py_venv_image_layer/.my_app_bin/bin/python3 - -rwxr-xr-x 0 0 0 698064 Jan 1 2023 ./py/tests/py_venv_image_layer/my_app_bin.runfiles/aspect_rules_py/py/tests/py_venv_image_layer/.my_app_bin/bin/python3.9 From 80a82e5da49524637cd63cf681b65f9015226864 Mon Sep 17 00:00:00 2001 From: "Reid D. McKenzie" Date: Tue, 10 Jun 2025 12:17:10 -0600 Subject: [PATCH 4/6] Fix: Don't pollute stdout --- py/tools/venv_shim/src/main.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/py/tools/venv_shim/src/main.rs b/py/tools/venv_shim/src/main.rs index 0faf8180..9b05b4fa 100644 --- a/py/tools/venv_shim/src/main.rs +++ b/py/tools/venv_shim/src/main.rs @@ -170,7 +170,7 @@ fn main() -> miette::Result<()> { { eprintln!("[aspect] Found potential Python interpreters in PATH with matching version:"); for exe in &python_executables { - println!("[aspect] - {:?}", exe); + eprintln!("[aspect] - {:?}", exe); } } From effe89f2917484ed0b2636014041e62e7762da05 Mon Sep 17 00:00:00 2001 From: Reid D McKenzie Date: Tue, 10 Jun 2025 12:17:30 -0600 Subject: [PATCH 5/6] Whitespace --- py/tools/py/src/activate.tmpl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/py/tools/py/src/activate.tmpl b/py/tools/py/src/activate.tmpl index 5dbd72bb..13ab0775 100644 --- a/py/tools/py/src/activate.tmpl +++ b/py/tools/py/src/activate.tmpl @@ -86,7 +86,7 @@ _OLD_VIRTUAL_PATH="$PATH" {{RUNFILES_INTERPRETER}} _abspath() { - "${PYTHONEXECUTABLE}" -c 'import os, sys; print(os.path.abspath(sys.argv[1]))' "$@" + "${PYTHONEXECUTABLE}" -c 'import os, sys; print(os.path.abspath(sys.argv[1]))' "$@" } # Re-export abspath'd vars From 716c463010e917f50aca9302febdd981fcccd11f Mon Sep 17 00:00:00 2001 From: "Reid D. McKenzie" Date: Tue, 10 Jun 2025 12:21:45 -0600 Subject: [PATCH 6/6] Update manifests. --- py/tests/py_venv_image_layer/my_app_amd64_layers_listing.yaml | 2 +- py/tests/py_venv_image_layer/my_app_arm64_layers_listing.yaml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/py/tests/py_venv_image_layer/my_app_amd64_layers_listing.yaml b/py/tests/py_venv_image_layer/my_app_amd64_layers_listing.yaml index 83d3add4..77a8877f 100644 --- a/py/tests/py_venv_image_layer/my_app_amd64_layers_listing.yaml +++ b/py/tests/py_venv_image_layer/my_app_amd64_layers_listing.yaml @@ -2510,7 +2510,7 @@ files: - drwxr-xr-x 0 0 0 0 Jan 1 2023 ./py/tests/py_venv_image_layer/my_app_bin.runfiles/aspect_rules_py/py/tests/py_venv_image_layer/ - drwxr-xr-x 0 0 0 0 Jan 1 2023 ./py/tests/py_venv_image_layer/my_app_bin.runfiles/aspect_rules_py/py/tests/py_venv_image_layer/.my_app_bin/ - drwxr-xr-x 0 0 0 0 Jan 1 2023 ./py/tests/py_venv_image_layer/my_app_bin.runfiles/aspect_rules_py/py/tests/py_venv_image_layer/.my_app_bin/bin/ - - -rwxr-xr-x 0 0 0 8619 Jan 1 2023 ./py/tests/py_venv_image_layer/my_app_bin.runfiles/aspect_rules_py/py/tests/py_venv_image_layer/.my_app_bin/bin/activate + - -rwxr-xr-x 0 0 0 8620 Jan 1 2023 ./py/tests/py_venv_image_layer/my_app_bin.runfiles/aspect_rules_py/py/tests/py_venv_image_layer/.my_app_bin/bin/activate - -rwxr-xr-x 0 0 0 817416 Jan 1 2023 ./py/tests/py_venv_image_layer/my_app_bin.runfiles/aspect_rules_py/py/tests/py_venv_image_layer/.my_app_bin/bin/python - -rwxr-xr-x 0 0 0 817416 Jan 1 2023 ./py/tests/py_venv_image_layer/my_app_bin.runfiles/aspect_rules_py/py/tests/py_venv_image_layer/.my_app_bin/bin/python3 - -rwxr-xr-x 0 0 0 817416 Jan 1 2023 ./py/tests/py_venv_image_layer/my_app_bin.runfiles/aspect_rules_py/py/tests/py_venv_image_layer/.my_app_bin/bin/python3.9 diff --git a/py/tests/py_venv_image_layer/my_app_arm64_layers_listing.yaml b/py/tests/py_venv_image_layer/my_app_arm64_layers_listing.yaml index 0fb7f006..c0911796 100644 --- a/py/tests/py_venv_image_layer/my_app_arm64_layers_listing.yaml +++ b/py/tests/py_venv_image_layer/my_app_arm64_layers_listing.yaml @@ -2491,7 +2491,7 @@ files: - drwxr-xr-x 0 0 0 0 Jan 1 2023 ./py/tests/py_venv_image_layer/my_app_bin.runfiles/aspect_rules_py/py/tests/py_venv_image_layer/ - drwxr-xr-x 0 0 0 0 Jan 1 2023 ./py/tests/py_venv_image_layer/my_app_bin.runfiles/aspect_rules_py/py/tests/py_venv_image_layer/.my_app_bin/ - drwxr-xr-x 0 0 0 0 Jan 1 2023 ./py/tests/py_venv_image_layer/my_app_bin.runfiles/aspect_rules_py/py/tests/py_venv_image_layer/.my_app_bin/bin/ - - -rwxr-xr-x 0 0 0 8620 Jan 1 2023 ./py/tests/py_venv_image_layer/my_app_bin.runfiles/aspect_rules_py/py/tests/py_venv_image_layer/.my_app_bin/bin/activate + - -rwxr-xr-x 0 0 0 8621 Jan 1 2023 ./py/tests/py_venv_image_layer/my_app_bin.runfiles/aspect_rules_py/py/tests/py_venv_image_layer/.my_app_bin/bin/activate - -rwxr-xr-x 0 0 0 698064 Jan 1 2023 ./py/tests/py_venv_image_layer/my_app_bin.runfiles/aspect_rules_py/py/tests/py_venv_image_layer/.my_app_bin/bin/python - -rwxr-xr-x 0 0 0 698064 Jan 1 2023 ./py/tests/py_venv_image_layer/my_app_bin.runfiles/aspect_rules_py/py/tests/py_venv_image_layer/.my_app_bin/bin/python3 - -rwxr-xr-x 0 0 0 698064 Jan 1 2023 ./py/tests/py_venv_image_layer/my_app_bin.runfiles/aspect_rules_py/py/tests/py_venv_image_layer/.my_app_bin/bin/python3.9