mirror of
https://github.com/pyenv/pyenv-virtualenv.git
synced 2025-11-10 12:33:54 -05:00
support newer conda
pyenv-virtualenvs could not list conda environments & pyenv shell would only activate the base conda environment the conda detection criteria of testing the presence of `conda` or `activate` files under `$(pyenv root)/versions/$version/bin` appears to be the culprit, since newer environments no longer include these files: those files reside in the base conda environment - add detection criteria of `$(pyenv root)/versions/$version/conda-meta` - compute the real prefix to the base environment from `realpath $(realpath $(pyenv root)/versions/$version)/../..` - to allow that, enhance substitute `realpath` in `pyenv-virtualenvs` to reduce relative paths `.` & `..`, and factor that code out to a file under `libexec` for reuse - hook `which` to locate conda from the real prefix
This commit is contained in:
@@ -177,7 +177,8 @@ EOS
|
|||||||
esac
|
esac
|
||||||
|
|
||||||
# anaconda/miniconda
|
# anaconda/miniconda
|
||||||
if [ -x "${prefix}/bin/conda" ]; then
|
if [ -d "${prefix}/conda-meta" ] ||
|
||||||
|
[ -x "${prefix}/bin/conda" ]; then
|
||||||
if [[ "${prefix}" != "${prefix%/envs/*}" ]]; then
|
if [[ "${prefix}" != "${prefix%/envs/*}" ]]; then
|
||||||
CONDA_DEFAULT_ENV="${venv##*/envs/}"
|
CONDA_DEFAULT_ENV="${venv##*/envs/}"
|
||||||
else
|
else
|
||||||
@@ -233,7 +234,8 @@ EOS
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
# conda package anaconda/miniconda scripts (#173)
|
# conda package anaconda/miniconda scripts (#173)
|
||||||
if [ -x "${prefix}/bin/conda" ]; then
|
if [ -d "${prefix}/conda-meta" ] ||
|
||||||
|
[ -x "${prefix}/bin/conda" ]; then
|
||||||
shopt -s nullglob
|
shopt -s nullglob
|
||||||
case "${shell}" in
|
case "${shell}" in
|
||||||
fish )
|
fish )
|
||||||
|
|||||||
@@ -59,7 +59,8 @@ if [ -n "$PYENV_VIRTUALENV_VERBOSE_ACTIVATE" ]; then
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
# conda package anaconda/miniconda scripts (#173)
|
# conda package anaconda/miniconda scripts (#173)
|
||||||
if [ -x "${prefix}/bin/conda" ]; then
|
if [ -d "${prefix}/conda-meta" ] ||
|
||||||
|
[ -x "${prefix}/bin/conda" ]; then
|
||||||
shopt -s nullglob
|
shopt -s nullglob
|
||||||
case "${shell}" in
|
case "${shell}" in
|
||||||
fish )
|
fish )
|
||||||
|
|||||||
@@ -6,6 +6,7 @@
|
|||||||
|
|
||||||
set -e
|
set -e
|
||||||
[ -n "$PYENV_DEBUG" ] && set -x
|
[ -n "$PYENV_DEBUG" ] && set -x
|
||||||
|
. "${BASH_SOURCE%/*}"/../libexec/pyenv-virtualenv-realpath
|
||||||
|
|
||||||
if [ -z "$PYENV_ROOT" ]; then
|
if [ -z "$PYENV_ROOT" ]; then
|
||||||
PYENV_ROOT="${HOME}/.pyenv"
|
PYENV_ROOT="${HOME}/.pyenv"
|
||||||
@@ -19,6 +20,15 @@ else
|
|||||||
IFS=: versions=($(pyenv-version-name))
|
IFS=: versions=($(pyenv-version-name))
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
append_virtualenv_prefix() {
|
||||||
|
if [ -d "${VIRTUALENV_PREFIX_PATH}" ]; then
|
||||||
|
VIRTUALENV_PREFIX_PATHS=("${VIRTUALENV_PREFIX_PATHS[@]}" "${VIRTUALENV_PREFIX_PATH:-${PYENV_PREFIX_PATH}}")
|
||||||
|
else
|
||||||
|
echo "pyenv-virtualenv: version \`${version}' is not a virtualenv" 1>&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
VIRTUALENV_PREFIX_PATHS=()
|
VIRTUALENV_PREFIX_PATHS=()
|
||||||
for version in "${versions[@]}"; do
|
for version in "${versions[@]}"; do
|
||||||
if [ "$version" = "system" ]; then
|
if [ "$version" = "system" ]; then
|
||||||
@@ -55,12 +65,11 @@ for version in "${versions[@]}"; do
|
|||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
if [ -d "${VIRTUALENV_PREFIX_PATH}" ]; then
|
append_virtualenv_prefix
|
||||||
VIRTUALENV_PREFIX_PATHS=("${VIRTUALENV_PREFIX_PATHS[@]}" "${VIRTUALENV_PREFIX_PATH:-${PYENV_PREFIX_PATH}}")
|
elif [ -d "${PYENV_PREFIX_PATH}/conda-meta" ]; then
|
||||||
else
|
# conda
|
||||||
echo "pyenv-virtualenv: version \`${version}' is not a virtualenv" 1>&2
|
VIRTUALENV_PREFIX_PATH="$(realpath "${PYENV_PREFIX_PATH}"/../..)"
|
||||||
exit 1
|
append_virtualenv_prefix
|
||||||
fi
|
|
||||||
else
|
else
|
||||||
echo "pyenv-virtualenv: version \`${version}' is not a virtualenv" 1>&2
|
echo "pyenv-virtualenv: version \`${version}' is not a virtualenv" 1>&2
|
||||||
exit 1
|
exit 1
|
||||||
|
|||||||
@@ -7,6 +7,7 @@
|
|||||||
|
|
||||||
set -e
|
set -e
|
||||||
[ -n "$PYENV_DEBUG" ] && set -x
|
[ -n "$PYENV_DEBUG" ] && set -x
|
||||||
|
. "${BASH_SOURCE%/*}"/../libexec/pyenv-virtualenv-realpath
|
||||||
|
|
||||||
if [ -z "$PYENV_ROOT" ]; then
|
if [ -z "$PYENV_ROOT" ]; then
|
||||||
PYENV_ROOT="${HOME}/.pyenv"
|
PYENV_ROOT="${HOME}/.pyenv"
|
||||||
@@ -32,38 +33,6 @@ done
|
|||||||
|
|
||||||
versions_dir="${PYENV_ROOT}/versions"
|
versions_dir="${PYENV_ROOT}/versions"
|
||||||
|
|
||||||
if ! enable -f "${BASH_SOURCE%/*}"/../libexec/pyenv-realpath.dylib realpath 2>/dev/null; then
|
|
||||||
if [ -n "$PYENV_NATIVE_EXT" ]; then
|
|
||||||
echo "pyenv: failed to load \`realpath' builtin" >&2
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
READLINK=$(type -p greadlink readlink | head -1)
|
|
||||||
if [ -z "$READLINK" ]; then
|
|
||||||
echo "pyenv: cannot find readlink - are you missing GNU coreutils?" >&2
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
resolve_link() {
|
|
||||||
$READLINK "$1"
|
|
||||||
}
|
|
||||||
|
|
||||||
realpath() {
|
|
||||||
local cwd="$PWD"
|
|
||||||
local path="$1"
|
|
||||||
local name
|
|
||||||
|
|
||||||
while [ -n "$path" ]; do
|
|
||||||
name="${path##*/}"
|
|
||||||
[ "$name" = "$path" ] || cd "${path%/*}"
|
|
||||||
path="$(resolve_link "$name" || true)"
|
|
||||||
done
|
|
||||||
|
|
||||||
echo "${PWD}/$name"
|
|
||||||
cd "$cwd"
|
|
||||||
}
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ -d "$versions_dir" ]; then
|
if [ -d "$versions_dir" ]; then
|
||||||
versions_dir="$(realpath "$versions_dir")"
|
versions_dir="$(realpath "$versions_dir")"
|
||||||
fi
|
fi
|
||||||
|
|||||||
11
etc/pyenv.d/which/conda.bash
Normal file
11
etc/pyenv.d/which/conda.bash
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
# newer versions of conda share programs from the real prefix
|
||||||
|
# this hook tries to find the executable there
|
||||||
|
|
||||||
|
if [ ! -x "${PYENV_COMMAND_PATH}" ] && [[ "${PYENV_COMMAND_PATH##*/}" == "conda" ]]; then
|
||||||
|
if [ -d "${PYENV_ROOT}/versions/${version}/conda-meta" ]; then
|
||||||
|
conda_command_path="$(pyenv-virtualenv-prefix "$version")"/bin/"${PYENV_COMMAND_PATH##*/}"
|
||||||
|
if [ -x "${conda_command_path}" ]; then
|
||||||
|
PYENV_COMMAND_PATH="${conda_command_path}"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
fi
|
||||||
50
libexec/pyenv-virtualenv-realpath
Normal file
50
libexec/pyenv-virtualenv-realpath
Normal file
@@ -0,0 +1,50 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
# Summary: Substitute realpath if unavailable as a builtin or file
|
||||||
|
# Usage: . pyenv-virtualenv-realpath
|
||||||
|
|
||||||
|
if ! {
|
||||||
|
enable -f "${BASH_SOURCE%/*}"/../libexec/pyenv-realpath.dylib realpath ||
|
||||||
|
type realpath
|
||||||
|
} >/dev/null 2>&1; then
|
||||||
|
if [ -n "$PYENV_NATIVE_EXT" ]; then
|
||||||
|
echo "pyenv: failed to load \`realpath' builtin" >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
READLINK=$(type -p greadlink readlink | head -1)
|
||||||
|
if [ -z "$READLINK" ]; then
|
||||||
|
echo "pyenv: cannot find readlink - are you missing GNU coreutils?" >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
resolve_link() {
|
||||||
|
$READLINK "$1"
|
||||||
|
}
|
||||||
|
|
||||||
|
realpath() {
|
||||||
|
local f="$*" \
|
||||||
|
name dir
|
||||||
|
[[ $f ]] || {
|
||||||
|
>&2 echo ${FUNCNAME[0]}: missing operand
|
||||||
|
return
|
||||||
|
}
|
||||||
|
while [[ -L $f ]]; do
|
||||||
|
f="$(resolve_link "$f")"
|
||||||
|
done
|
||||||
|
if [[ ! -d $f ]]; then
|
||||||
|
name="/${f##*/}"
|
||||||
|
# parent?
|
||||||
|
dir="${f%/*}"
|
||||||
|
if [[ $dir == $f ]]; then
|
||||||
|
#lacks /: parent is current directory
|
||||||
|
f="$PWD"
|
||||||
|
else
|
||||||
|
f="$dir"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
#absolute directory
|
||||||
|
dir="$(cd "$f"
|
||||||
|
pwd)"
|
||||||
|
echo "$dir$name"
|
||||||
|
}
|
||||||
|
fi
|
||||||
Reference in New Issue
Block a user