You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

97 lines
3.1 KiB

  1. #!/usr/bin/env bash
  2. #
  3. # Summary: Display real_prefix for a Python virtualenv version
  4. # Usage: pyenv virtualenv-prefix [<virtualenv>]
  5. #
  6. set -e
  7. [ -n "$PYENV_DEBUG" ] && set -x
  8. if [ -L "${BASH_SOURCE}" ]; then
  9. READLINK=$(type -p greadlink readlink | head -1)
  10. if [ -z "$READLINK" ]; then
  11. echo "pyenv: cannot find readlink - are you missing GNU coreutils?" >&2
  12. exit 1
  13. fi
  14. resolve_link() {
  15. $READLINK -f "$1"
  16. }
  17. script_path=$(resolve_link ${BASH_SOURCE})
  18. else
  19. script_path=${BASH_SOURCE}
  20. fi
  21. . ${script_path%/*}/../libexec/pyenv-virtualenv-realpath
  22. if [ -z "$PYENV_ROOT" ]; then
  23. PYENV_ROOT="${HOME}/.pyenv"
  24. fi
  25. if [ -n "$1" ]; then
  26. versions=($@)
  27. IFS=: PYENV_VERSION="${versions[*]}"
  28. export PYENV_VERSION
  29. else
  30. IFS=: versions=($(pyenv-version-name))
  31. fi
  32. append_virtualenv_prefix() {
  33. if [ -d "${VIRTUALENV_PREFIX_PATH}" ]; then
  34. VIRTUALENV_PREFIX_PATHS=("${VIRTUALENV_PREFIX_PATHS[@]}" "${VIRTUALENV_PREFIX_PATH:-${PYENV_PREFIX_PATH}}")
  35. else
  36. echo "pyenv-virtualenv: version \`${version}' is not a virtualenv" 1>&2
  37. exit 1
  38. fi
  39. }
  40. VIRTUALENV_PREFIX_PATHS=()
  41. for version in "${versions[@]}"; do
  42. if [ "$version" = "system" ]; then
  43. echo "pyenv-virtualenv: version \`${version}' is not a virtualenv" 1>&2
  44. exit 1
  45. fi
  46. PYENV_PREFIX_PATH="$(pyenv-prefix "${version}")"
  47. if [ -x "${PYENV_PREFIX_PATH}/bin/python" ]; then
  48. if [ -f "${PYENV_PREFIX_PATH}/bin/activate" ]; then
  49. if [ -f "${PYENV_PREFIX_PATH}/bin/conda" ]; then
  50. # conda
  51. VIRTUALENV_PREFIX_PATH="${PYENV_PREFIX_PATH}"
  52. else
  53. if [ -f "${PYENV_ROOT}/versions/${version}/pyvenv.cfg" ]; then
  54. # venv
  55. virtualenv_binpath="$(cut -b 1-1024 "${PYENV_ROOT}/versions/${version}/pyvenv.cfg" | sed -n '/^ *home *= */s///p' || true)"
  56. VIRTUALENV_PREFIX_PATH="${virtualenv_binpath%/bin}"
  57. else
  58. # virtualenv
  59. if [ -d "${PYENV_ROOT}/versions/${version}/Lib" ]; then
  60. # jython
  61. virtualenv_libpath="${PYENV_ROOT}/versions/${version}/Lib"
  62. else
  63. if [ -d "${PYENV_ROOT}/versions/${version}/lib-python" ]; then
  64. # pypy
  65. virtualenv_libpath="${PYENV_ROOT}/versions/${version}/lib-python"
  66. else
  67. virtualenv_libpath="${PYENV_ROOT}/versions/${version}/lib"
  68. fi
  69. fi
  70. virtualenv_orig_prefix="$(find "${virtualenv_libpath}/" -maxdepth 2 -type f -and -name "orig-prefix.txt" 2>/dev/null | head -1)"
  71. if [ -f "${virtualenv_orig_prefix}" ]; then
  72. VIRTUALENV_PREFIX_PATH="$(cat "${virtualenv_orig_prefix}" 2>/dev/null || true)"
  73. fi
  74. fi
  75. fi
  76. append_virtualenv_prefix
  77. elif [ -d "${PYENV_PREFIX_PATH}/conda-meta" ]; then
  78. # conda
  79. VIRTUALENV_PREFIX_PATH="$(realpath "${PYENV_PREFIX_PATH}"/../..)"
  80. append_virtualenv_prefix
  81. else
  82. echo "pyenv-virtualenv: version \`${version}' is not a virtualenv" 1>&2
  83. exit 1
  84. fi
  85. else
  86. echo "pyenv-virtualenv: \`python' not found in version \`${version}'" 1>&2
  87. exit 1
  88. fi
  89. done
  90. IFS=: echo "${VIRTUALENV_PREFIX_PATHS[*]}"