mirror of
https://github.com/pyenv/pyenv-virtualenv.git
synced 2025-11-14 14:33:52 -05:00
Compare commits
12 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
2a5a483c5d | ||
|
|
a2c878f284 | ||
|
|
b7c498ce03 | ||
|
|
6915cd0320 | ||
|
|
4263783195 | ||
|
|
65b58770a7 | ||
|
|
66546cea12 | ||
|
|
7562795c42 | ||
|
|
72592fde6b | ||
|
|
8ac27a7a77 | ||
|
|
f9532f6c4e | ||
|
|
67d6cfc0d2 |
@@ -30,7 +30,7 @@ To create a virtualenv for the Python version use with pyenv, run
|
|||||||
`pyenv virtualenv` with tha exact name of the version you want to create
|
`pyenv virtualenv` with tha exact name of the version you want to create
|
||||||
virtualenv. For example,
|
virtualenv. For example,
|
||||||
|
|
||||||
$ pyenv virtualenv --distribute 2.7.3 venv27
|
$ pyenv virtualenv 2.7.3 venv27
|
||||||
|
|
||||||
virtualenvs will be created into a directory of the same name
|
virtualenvs will be created into a directory of the same name
|
||||||
under `~/.pyenv/versions`.
|
under `~/.pyenv/versions`.
|
||||||
@@ -50,6 +50,11 @@ You can set certain environment variables to control the pyenv-virtualenv.
|
|||||||
|
|
||||||
## Version History
|
## Version History
|
||||||
|
|
||||||
|
#### 20130614
|
||||||
|
|
||||||
|
* Add `pyenv virtualenvs` to list all virtualenv versions.
|
||||||
|
* *EXPERIMENTAL* Add `--upgrade` option to re-create virtualenv with migrating packages
|
||||||
|
|
||||||
#### 20130527
|
#### 20130527
|
||||||
|
|
||||||
* Remove `python-virtualenv` which was no longer used.
|
* Remove `python-virtualenv` which was no longer used.
|
||||||
|
|||||||
@@ -2,12 +2,15 @@
|
|||||||
#
|
#
|
||||||
# Summary: Create a Python virtualenv using the pyenv-virtualenv plugin
|
# Summary: Create a Python virtualenv using the pyenv-virtualenv plugin
|
||||||
#
|
#
|
||||||
# Usage: pyenv virtualenv [VIRTUALENV_OPTIONS] <version> <virtualenv-name>
|
# Usage: pyenv virtualenv [-f|--force] [-u|--upgrade] [VIRTUALENV_OPTIONS] <version> <virtualenv-name>
|
||||||
# pyenv virtualenv --version
|
# pyenv virtualenv --version
|
||||||
# pyenv virtualenv --help
|
# pyenv virtualenv --help
|
||||||
#
|
#
|
||||||
|
# -u/--upgrade Upgrade existing virtualenv with migrating installed packages
|
||||||
|
# -f/--force Install even if the version appears to be installed already
|
||||||
|
#
|
||||||
|
|
||||||
PYENV_VIRTUALENV_VERSION="20130527"
|
PYENV_VIRTUALENV_VERSION="20130614"
|
||||||
VIRTUALENV_VERSION="${VIRTUALENV_VERSION:-1.9.1}"
|
VIRTUALENV_VERSION="${VIRTUALENV_VERSION:-1.9.1}"
|
||||||
|
|
||||||
set -e
|
set -e
|
||||||
@@ -97,7 +100,7 @@ http_get_wget() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
version() {
|
version() {
|
||||||
local version="$(pyenv-exec python "${VIRTUALENV}" --version || true)"
|
local version="$(pyenv-exec python "${VIRTUALENV}" --version 2>/dev/null || true)"
|
||||||
echo "pyenv-virtualenv ${PYENV_VIRTUALENV_VERSION} (virtualenv ${version:-unknown})"
|
echo "pyenv-virtualenv ${PYENV_VIRTUALENV_VERSION} (virtualenv ${version:-unknown})"
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -133,6 +136,8 @@ ensure_virtualenv "${VIRTUALENV}" "${VIRTUALENV_URL}" || {
|
|||||||
exit 1
|
exit 1
|
||||||
}
|
}
|
||||||
|
|
||||||
|
unset FORCE
|
||||||
|
unset UPGRADE
|
||||||
# Unset environment variables which starts with `VIRTUALENV_`.
|
# Unset environment variables which starts with `VIRTUALENV_`.
|
||||||
# These variables are reserved for virtualenv.
|
# These variables are reserved for virtualenv.
|
||||||
unset VIRTUALENV_VERSION
|
unset VIRTUALENV_VERSION
|
||||||
@@ -140,9 +145,15 @@ unset VIRTUALENV_VERSION
|
|||||||
parse_options "$@"
|
parse_options "$@"
|
||||||
for option in "${OPTIONS[@]}"; do
|
for option in "${OPTIONS[@]}"; do
|
||||||
case "$option" in
|
case "$option" in
|
||||||
|
"f" | "force" )
|
||||||
|
FORCE=true
|
||||||
|
;;
|
||||||
"h" | "help" )
|
"h" | "help" )
|
||||||
usage 0
|
usage 0
|
||||||
;;
|
;;
|
||||||
|
"u" | "upgrade" )
|
||||||
|
UPGRADE=true
|
||||||
|
;;
|
||||||
"version" )
|
"version" )
|
||||||
version
|
version
|
||||||
exit 0
|
exit 0
|
||||||
@@ -157,29 +168,19 @@ done
|
|||||||
VERSION_NAME="${ARGUMENTS[0]}"
|
VERSION_NAME="${ARGUMENTS[0]}"
|
||||||
[ -n "$VERSION_NAME" ] || usage 1
|
[ -n "$VERSION_NAME" ] || usage 1
|
||||||
|
|
||||||
|
if [ -z "$TMPDIR" ]; then
|
||||||
|
TMP="/tmp"
|
||||||
|
else
|
||||||
|
TMP="${TMPDIR%/}"
|
||||||
|
fi
|
||||||
|
|
||||||
# Define `before_virtualenv` and `after_virtualenv` functions that allow
|
SEED="$(date "+%Y%m%d%H%M%S").$$"
|
||||||
# plugin hooks to register a string of code for execution before or
|
UPGRADE_PATH="${TMP}/pyenv-virtualenv.${SEED}"
|
||||||
# after the installation process.
|
UPGRADE_LIST="${TMP}/pyenv-virtualenv.${SEED}.txt"
|
||||||
declare -a before_hooks after_hooks
|
|
||||||
|
|
||||||
before_virtualenv() {
|
|
||||||
local hook="$1"
|
|
||||||
before_hooks["${#before_hooks[@]}"]="$hook"
|
|
||||||
}
|
|
||||||
|
|
||||||
after_virtualenv() {
|
|
||||||
local hook="$1"
|
|
||||||
after_hooks["${#after_hooks[@]}"]="$hook"
|
|
||||||
}
|
|
||||||
|
|
||||||
# Load plugin hooks.
|
|
||||||
for script in $(pyenv-hooks virtualenv); do
|
|
||||||
source "$script"
|
|
||||||
done
|
|
||||||
|
|
||||||
|
|
||||||
PYTHON_BIN=$(PYENV_VERSION="${VERSION_NAME}" pyenv-which python)
|
|
||||||
|
PYTHON_BIN="$(PYENV_VERSION="${VERSION_NAME}" pyenv-which python)"
|
||||||
if [ ! -x "${PYTHON_BIN}" ]; then
|
if [ ! -x "${PYTHON_BIN}" ]; then
|
||||||
echo "pyenv-virtualenv: could not find python executable: ${PYTHON_BIN}" 1>&2
|
echo "pyenv-virtualenv: could not find python executable: ${PYTHON_BIN}" 1>&2
|
||||||
exit 1
|
exit 1
|
||||||
@@ -205,19 +206,54 @@ fi
|
|||||||
VIRTUALENV_NAME="${ARGUMENTS[1]##*/}"
|
VIRTUALENV_NAME="${ARGUMENTS[1]##*/}"
|
||||||
VIRTUALENV_PATH="${PYENV_ROOT}/versions/${VIRTUALENV_NAME}"
|
VIRTUALENV_PATH="${PYENV_ROOT}/versions/${VIRTUALENV_NAME}"
|
||||||
VIRTUALENV_PYTHON_BIN="${VIRTUALENV_PATH}/bin/python"
|
VIRTUALENV_PYTHON_BIN="${VIRTUALENV_PATH}/bin/python"
|
||||||
|
VIRTUALENV_PIP_BIN="${VIRTUALENV_PATH}/bin/pip"
|
||||||
|
|
||||||
|
|
||||||
|
# Define `before_virtualenv` and `after_virtualenv` functions that allow
|
||||||
|
# plugin hooks to register a string of code for execution before or
|
||||||
|
# after the installation process.
|
||||||
|
declare -a before_hooks after_hooks
|
||||||
|
|
||||||
|
before_virtualenv() {
|
||||||
|
local hook="$1"
|
||||||
|
before_hooks["${#before_hooks[@]}"]="$hook"
|
||||||
|
}
|
||||||
|
|
||||||
|
after_virtualenv() {
|
||||||
|
local hook="$1"
|
||||||
|
after_hooks["${#after_hooks[@]}"]="$hook"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Load plugin hooks.
|
||||||
|
for script in $(pyenv-hooks virtualenv); do
|
||||||
|
source "$script"
|
||||||
|
done
|
||||||
|
|
||||||
|
|
||||||
[ -d "${VIRTUALENV_PATH}" ] && PREFIX_EXISTS=1
|
[ -d "${VIRTUALENV_PATH}" ] && PREFIX_EXISTS=1
|
||||||
|
|
||||||
# If the virtualenv exists, prompt for confirmation unless
|
# If the virtualenv exists, prompt for confirmation unless
|
||||||
# the --force option was specified.
|
# the --force option was specified.
|
||||||
if [ -z "$FORCE" ] && [ -d "${VIRTUALENV_PATH}/bin" ]; then
|
if [ -d "${VIRTUALENV_PATH}/bin" ]; then
|
||||||
echo "pyenv: $VIRTUALENV_PATH already exists" >&2
|
if [ -z "$FORCE" ]; then
|
||||||
read -p "continue with installation? (y/N) "
|
echo "pyenv: ${VIRTUALENV_PATH} already exists" 1>&2
|
||||||
|
read -p "continue with installation? (y/N) "
|
||||||
|
|
||||||
case "$REPLY" in
|
case "$REPLY" in
|
||||||
y* | Y* ) ;;
|
y* | Y* ) ;;
|
||||||
* ) exit 1 ;;
|
* ) exit 1 ;;
|
||||||
esac
|
esac
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ -n "$UPGRADE" ]; then
|
||||||
|
if [ -x "${VIRTUALENV_PIP_BIN}" ]; then
|
||||||
|
"${VIRTUALENV_PIP_BIN}" freeze > "${UPGRADE_LIST}"
|
||||||
|
mv -f "${VIRTUALENV_PATH}" "${UPGRADE_PATH}"
|
||||||
|
else
|
||||||
|
echo "pyenv: pip is not installed in ${VIRTUALENV_PATH}" 1>&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Execute `before_virtualenv` hooks.
|
# Execute `before_virtualenv` hooks.
|
||||||
@@ -241,10 +277,32 @@ cd "${PYENV_VIRTUALENV_CACHE_PATH}"
|
|||||||
# create symlink of `python' bound for actual executable
|
# create symlink of `python' bound for actual executable
|
||||||
if [ ! -f "$VIRTUALENV_PYTHON_BIN" ]; then
|
if [ ! -f "$VIRTUALENV_PYTHON_BIN" ]; then
|
||||||
if [ -f "${VIRTUALENV_PATH}/bin/$(basename "${PYTHON_BIN}")" ]; then
|
if [ -f "${VIRTUALENV_PATH}/bin/$(basename "${PYTHON_BIN}")" ]; then
|
||||||
{
|
( cd "${VIRTUALENV_PATH}/bin" && ln -fs "$(basename "${PYTHON_BIN}")" python )
|
||||||
cd ${VIRTUALENV_PATH}/bin
|
fi
|
||||||
ln -fs "$(basename "${PYTHON_BIN}")" python
|
fi
|
||||||
}
|
|
||||||
|
## Migrate previously installed packages from requirements.txt
|
||||||
|
if [ -n "$UPGRADE" ]; then
|
||||||
|
UPGRADE_STATUS=0
|
||||||
|
if [ -x "${VIRTUALENV_PIP_BIN}" ]; then
|
||||||
|
"${VIRTUALENV_PIP_BIN}" install --requirement "${UPGRADE_LIST}" || UPGRADE_STATUS=$?
|
||||||
|
else
|
||||||
|
echo "pyenv: pip is not installed in ${VIRTUALENV_PATH}" 1>&2
|
||||||
|
UPGRADE_STATUS=1
|
||||||
|
fi
|
||||||
|
if [ "$UPGRADE_STATUS" == "0" ]; then
|
||||||
|
rm -f "${UPGRADE_LIST}"
|
||||||
|
rm -fr "${UPGRADE_PATH}"
|
||||||
|
else
|
||||||
|
{ echo
|
||||||
|
echo "UPGRADE FAILED"
|
||||||
|
echo
|
||||||
|
echo "Inspect or clean up the original tree at ${UPGRADE_PATH}"
|
||||||
|
echo
|
||||||
|
echo "Package list:"
|
||||||
|
cat "${UPGRADE_LIST}"
|
||||||
|
} 1>&2
|
||||||
|
STATUS="$UPGRADE_STATUS"
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
|||||||
19
bin/pyenv-virtualenv-prefix
Executable file
19
bin/pyenv-virtualenv-prefix
Executable file
@@ -0,0 +1,19 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
#
|
||||||
|
# Summary: Display real_prefix for a Python virtualenv version
|
||||||
|
# Usage: pyenv virtualenv-prefix [<virtualenv>]
|
||||||
|
#
|
||||||
|
|
||||||
|
set -e
|
||||||
|
[ -n "$PYENV_DEBUG" ] && set -x
|
||||||
|
|
||||||
|
if [ -z "$PYENV_ROOT" ]; then
|
||||||
|
PYENV_ROOT="${HOME}/.pyenv"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ -n "$1" ]; then
|
||||||
|
export PYENV_VERSION="$1"
|
||||||
|
fi
|
||||||
|
|
||||||
|
PYTHON_BIN="$(pyenv-which python)"
|
||||||
|
"${PYTHON_BIN}" -c 'import sys;print(sys.real_prefix)' 2>/dev/null
|
||||||
42
bin/pyenv-virtualenvs
Executable file
42
bin/pyenv-virtualenvs
Executable file
@@ -0,0 +1,42 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
#
|
||||||
|
# Summary: List all Python virtualenvs found in `$PYENV_ROOT/versions/*'.
|
||||||
|
#
|
||||||
|
# Usage: pyenv virtualenvs [--bare]
|
||||||
|
#
|
||||||
|
|
||||||
|
set -e
|
||||||
|
[ -n "$PYENV_DEBUG" ] && set -x
|
||||||
|
|
||||||
|
if [ -z "$PYENV_ROOT" ]; then
|
||||||
|
PYENV_ROOT="${HOME}/.pyenv"
|
||||||
|
fi
|
||||||
|
|
||||||
|
unset BARE
|
||||||
|
|
||||||
|
if [ "$1" = "--bare" ]; then
|
||||||
|
BARE=true
|
||||||
|
fi
|
||||||
|
|
||||||
|
print_version() {
|
||||||
|
local version="$1"
|
||||||
|
if [ -n "${BARE}" ]; then
|
||||||
|
echo "${version}"
|
||||||
|
else
|
||||||
|
echo "${version} (created from $(pyenv-virtualenv-prefix "${version}"))"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
virtualenv_version() {
|
||||||
|
local version="$1"
|
||||||
|
local prefix="$(pyenv-prefix "${version}")"
|
||||||
|
[ -f "${prefix}/bin/activate" ] && "${prefix}/bin/python" -c 'import sys;sys.real_prefix' 1>/dev/null 2>&1
|
||||||
|
}
|
||||||
|
|
||||||
|
versions=($(pyenv-versions --bare))
|
||||||
|
|
||||||
|
for version in "${versions[@]}"; do
|
||||||
|
if virtualenv_version "${version}"; then
|
||||||
|
print_version "${version}"
|
||||||
|
fi
|
||||||
|
done
|
||||||
Reference in New Issue
Block a user