Skip to content

Commit

Permalink
pyenv-exec: no -a with exec to keep $PATH with system version (#1169
Browse files Browse the repository at this point in the history
)

Using `exec -a` caused Python to use $PATH to look up the full program name (for
`sys.executable`), which 314937d then tried to fix by changing $PATH
also for the system version.
This is not necessary anymore when not using the short name with `exec`.

This was rejected upstream
(rbenv/rbenv#1089 (comment)), since
it is not a problem with Ruby apparently.

Uses $PYENV_ROOT to check if system version is used.

Fixes #98.
Fixes #789.
  • Loading branch information
blueyed committed Sep 28, 2019
1 parent 31b7e1c commit ecd67c8
Show file tree
Hide file tree
Showing 2 changed files with 41 additions and 4 deletions.
9 changes: 5 additions & 4 deletions libexec/pyenv-exec
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,8 @@ for script in "${scripts[@]}"; do
done

shift 1
# CPython's `sys.executable` requires the `PYENV_BIN_PATH` to be at the top of the `PATH`.
# https://github.com/pyenv/pyenv/issues/98
export PATH="${PYENV_BIN_PATH}:${PATH}"
exec -a "$PYENV_COMMAND" "$PYENV_COMMAND_PATH" "$@"
if [ "${PYENV_BIN_PATH#${PYENV_ROOT}}" != "${PYENV_BIN_PATH}" ]; then
# Only add to $PATH for non-system version.
export PATH="${PYENV_BIN_PATH}:${PATH}"
fi
exec "$PYENV_COMMAND_PATH" "$@"
36 changes: 36 additions & 0 deletions test/exec.bats
Original file line number Diff line number Diff line change
Expand Up @@ -77,3 +77,39 @@ ${PYENV_ROOT}/versions/3.4/bin/python
args
OUT
}

@test "sys.executable with system version (#98)" {
system_python=$(which python)

PYENV_VERSION="custom"
create_executable "python" ""
unset PYENV_VERSION

pyenv-rehash
run pyenv-exec python -c 'import sys; print(sys.executable)'
assert_success "${system_python}"
}

@test '$PATH is not modified with system Python' {
# Create a wrapper executable that verifies PATH.
PYENV_VERSION="custom"
create_executable "python" '[[ "$PATH" == "${PYENV_TEST_DIR}/root/versions/custom/bin:"* ]] || { echo "unexpected:$PATH"; exit 2;}'
unset PYENV_VERSION
pyenv-rehash

# Path is not modified with system Python.
run pyenv-exec python -c 'import os; print(os.getenv("PATH"))'
assert_success "$PATH"

# Path is modified with custom Python.
PYENV_VERSION=custom run pyenv-exec python
assert_success

# Path is modified with custom:system Python.
PYENV_VERSION=custom:system run pyenv-exec python
assert_success

# Path is not modified with system:custom Python.
PYENV_VERSION=system:custom run pyenv-exec python -c 'import os; print(os.getenv("PATH"))'
assert_success "$PATH"
}

0 comments on commit ecd67c8

Please sign in to comment.