mirror of
https://github.com/pyenv/pyenv-virtualenv.git
synced 2025-11-08 11:33:55 -05:00
Compare commits
9 Commits
a63b38b2e6
...
master
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
387f627464 | ||
|
|
4b3f5f8468 | ||
|
|
3057e1549b | ||
|
|
aa9b8e9a5a | ||
|
|
e8c8fd9b84 | ||
|
|
db299cada3 | ||
|
|
c6bb0694bf | ||
|
|
28cd9be54e | ||
|
|
d4c9655e26 |
3
.github/workflows/tests.yml
vendored
3
.github/workflows/tests.yml
vendored
@@ -6,8 +6,9 @@ jobs:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
os:
|
||||
- ubuntu-24.04
|
||||
- ubuntu-22.04
|
||||
- ubuntu-20.04
|
||||
- macos-15
|
||||
- macos-14
|
||||
- macos-13
|
||||
runs-on: ${{ matrix.os }}
|
||||
|
||||
2
LICENSE
2
LICENSE
@@ -1,4 +1,4 @@
|
||||
Copyright (c) 2015 Yamashita, Yuu
|
||||
Copyright (c) 2025 Yamashita, Yuu
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining
|
||||
a copy of this software and associated documentation files (the
|
||||
|
||||
19
README.md
19
README.md
@@ -28,27 +28,33 @@ From inside that directory you can:
|
||||
- Get the latest development release by running `git pull` to download the
|
||||
latest changes.
|
||||
|
||||
💡 **WSL note:** If you're using WSL, we recommend setting Git to use Unix-style line endings to prevent script execution errors:
|
||||
|
||||
```sh
|
||||
git config --global core.autocrlf input
|
||||
```
|
||||
|
||||
1. **Check out pyenv-virtualenv into plugin directory**
|
||||
|
||||
```sh
|
||||
```bash
|
||||
git clone https://github.com/pyenv/pyenv-virtualenv.git $(pyenv root)/plugins/pyenv-virtualenv
|
||||
```
|
||||
|
||||
For the Fish shell:
|
||||
|
||||
```sh
|
||||
```fish
|
||||
git clone https://github.com/pyenv/pyenv-virtualenv.git (pyenv root)/plugins/pyenv-virtualenv
|
||||
```
|
||||
|
||||
2. (OPTIONAL) **Add `pyenv virtualenv-init` to your shell** to enable auto-activation of virtualenvs. This is entirely optional but pretty useful. See "Activate virtualenv" below.
|
||||
|
||||
```sh
|
||||
```bash
|
||||
echo 'eval "$(pyenv virtualenv-init -)"' >> ~/.bashrc
|
||||
```
|
||||
|
||||
**Fish shell note**: Add this to your `~/.config/fish/config.fish`
|
||||
|
||||
```sh
|
||||
```fish
|
||||
status --is-interactive; and pyenv virtualenv-init - | source
|
||||
```
|
||||
|
||||
@@ -56,7 +62,7 @@ From inside that directory you can:
|
||||
|
||||
3. **Restart your shell to enable pyenv-virtualenv**
|
||||
|
||||
```sh
|
||||
```bash
|
||||
exec "$SHELL"
|
||||
```
|
||||
|
||||
@@ -82,7 +88,7 @@ brew install --HEAD pyenv-virtualenv
|
||||
```
|
||||
|
||||
After installation, you'll still need to do
|
||||
[Pyenv shell setup steps](https://github.com/pyenv/pyenv#basic-github-checkout)
|
||||
[Pyenv shell setup steps](https://github.com/pyenv/pyenv#b-set-up-your-shell-environment-for-pyenv)
|
||||
then add
|
||||
```sh
|
||||
eval "$(pyenv virtualenv-init -)"
|
||||
@@ -243,6 +249,7 @@ You can set certain environment variables to control pyenv-virtualenv.
|
||||
* `PIP_VERSION`, if set and `venv` is preferred
|
||||
over `virtualenv`, install the specified version of pip.
|
||||
* `PYENV_VIRTUALENV_VERBOSE_ACTIVATE`, if set, shows some verbose outputs on activation and deactivation
|
||||
* `PYENV_VIRTUALENV_PROMPT`, if set, allows users to customize how `pyenv-virtualenv` modifies their shell prompt. The default prompt ("(venv)") is overwritten with any user-specified text. Specify the location of the virtual environment name with the string `{venv}`. For example, the default prompt string would be `({venv})`.
|
||||
|
||||
## Version History
|
||||
|
||||
|
||||
@@ -22,10 +22,8 @@ fi
|
||||
|
||||
{ printf "\x1B[31;1m"
|
||||
echo
|
||||
echo "Failed to activate virtualenv."
|
||||
echo
|
||||
echo "Perhaps pyenv-virtualenv has not been loaded into your shell properly."
|
||||
echo "Please restart current shell and try again."
|
||||
echo "\`pyenv activate' requires Pyenv and Pyenv-Virtualenv to be loaded into your shell."
|
||||
echo "Check your shell configuration and Pyenv and Pyenv-Virtualenv installation instructions."
|
||||
echo
|
||||
printf "\x1B[0m"
|
||||
} 1>&2
|
||||
|
||||
@@ -11,10 +11,8 @@ set -e
|
||||
|
||||
{ printf "\x1B[31;1m"
|
||||
echo
|
||||
echo "Failed to deactivate virtualenv."
|
||||
echo
|
||||
echo "Perhaps pyenv-virtualenv has not been loaded into your shell properly."
|
||||
echo "Please restart current shell and try again."
|
||||
echo "\`pyenv deactivate' requires Pyenv and Pyenv-Virtualenv to be loaded into your shell."
|
||||
echo "Check your shell configuration and Pyenv and Pyenv-Virtualenv installation instructions."
|
||||
echo
|
||||
printf "\x1B[0m"
|
||||
} 1>&2
|
||||
|
||||
@@ -262,9 +262,14 @@ EOS
|
||||
fi
|
||||
;;
|
||||
* )
|
||||
if [ -z "${PYENV_VIRTUALENV_PROMPT}" ]; then
|
||||
PYENV_VIRTUALENV_PROMPT="(${venv})"
|
||||
else
|
||||
PYENV_VIRTUALENV_PROMPT="${PYENV_VIRTUALENV_PROMPT/\{venv\}/${venv}}"
|
||||
fi
|
||||
cat <<EOS
|
||||
export _OLD_VIRTUAL_PS1="\${PS1:-}";
|
||||
export PS1="(${venv}) \${PS1:-}";
|
||||
export PS1="${PYENV_VIRTUALENV_PROMPT} \${PS1:-}";
|
||||
EOS
|
||||
;;
|
||||
esac
|
||||
|
||||
@@ -605,7 +605,13 @@ STATUS=0
|
||||
mkdir -p "${PYENV_VIRTUALENV_CACHE_PATH}"
|
||||
cd "${PYENV_VIRTUALENV_CACHE_PATH}"
|
||||
if [ -n "${USE_CONDA}" ]; then
|
||||
pyenv-exec conda create $QUIET $VERBOSE --name "${VIRTUALENV_PATH##*/}" --yes "${VIRTUALENV_OPTIONS[@]}" python || STATUS="$?"
|
||||
if [ -z "$VIRTUALENV_PYTHON" ]; then
|
||||
#process substitution doesn't seem to work unless it's directly inserted to the command line
|
||||
#if we add it to VIRTUALENV_OPTIONS instead, "broken pipe" happens
|
||||
pyenv-exec conda create $QUIET $VERBOSE --name "${VIRTUALENV_PATH##*/}" --yes "${VIRTUALENV_OPTIONS[@]}" --file <(pyenv-exec conda list python --full-name --export) || STATUS="$?"
|
||||
else
|
||||
pyenv-exec conda create $QUIET $VERBOSE --name "${VIRTUALENV_PATH##*/}" --yes "${VIRTUALENV_OPTIONS[@]}" || STATUS="$?"
|
||||
fi
|
||||
else
|
||||
if [ -n "${USE_M_VENV}" ]; then
|
||||
pyenv-exec "${M_VENV_PYTHON_BIN:-python}" -m venv $QUIET $VERBOSE "${VIRTUALENV_OPTIONS[@]}" "${VIRTUALENV_PATH}" || STATUS="$?"
|
||||
@@ -625,7 +631,8 @@ fi
|
||||
|
||||
## Create symlink in the `versions` directory for backward compatibility
|
||||
if [ -d "${VIRTUALENV_PATH}" ] && [ -n "${COMPAT_VIRTUALENV_PATH}" ]; then
|
||||
ln -fs "${VIRTUALENV_PATH}" "${COMPAT_VIRTUALENV_PATH}"
|
||||
# Overwrite an existing link, can happen if running with -f
|
||||
ln -fsn "${VIRTUALENV_PATH}" "${COMPAT_VIRTUALENV_PATH}"
|
||||
fi
|
||||
|
||||
if [ ! -e "${VIRTUALENV_PATH}/bin/pydoc" ]; then
|
||||
|
||||
@@ -15,6 +15,7 @@ setup() {
|
||||
unset PYENV_VIRTUALENV_DISABLE_PROMPT
|
||||
unset PYENV_VIRTUAL_ENV_DISABLE_PROMPT
|
||||
unset VIRTUAL_ENV_DISABLE_PROMPT
|
||||
unset PYENV_VIRTUALENV_PROMPT
|
||||
unset _OLD_VIRTUAL_PS1
|
||||
stub pyenv-hooks "activate : echo"
|
||||
}
|
||||
@@ -44,6 +45,31 @@ EOS
|
||||
unstub pyenv-sh-deactivate
|
||||
}
|
||||
|
||||
@test "activate virtualenv from current version with custom prompt" {
|
||||
export PYENV_VIRTUALENV_INIT=1
|
||||
|
||||
stub pyenv-version-name "echo venv"
|
||||
stub pyenv-virtualenv-prefix "venv : echo \"${PYENV_ROOT}/versions/venv\""
|
||||
stub pyenv-prefix "venv : echo \"${PYENV_ROOT}/versions/venv\""
|
||||
stub pyenv-sh-deactivate "--force --quiet : echo deactivated"
|
||||
|
||||
PYENV_SHELL="bash" PYENV_VERSION="venv" PYENV_VIRTUALENV_PROMPT='venv:{venv}' run pyenv-sh-activate
|
||||
|
||||
assert_success
|
||||
assert_output <<EOS
|
||||
deactivated
|
||||
export PYENV_VIRTUAL_ENV="${PYENV_ROOT}/versions/venv";
|
||||
export VIRTUAL_ENV="${PYENV_ROOT}/versions/venv";
|
||||
export _OLD_VIRTUAL_PS1="\${PS1:-}";
|
||||
export PS1="venv:venv \${PS1:-}";
|
||||
EOS
|
||||
|
||||
unstub pyenv-version-name
|
||||
unstub pyenv-virtualenv-prefix
|
||||
unstub pyenv-prefix
|
||||
unstub pyenv-sh-deactivate
|
||||
}
|
||||
|
||||
@test "activate virtualenv from current version (quiet)" {
|
||||
export PYENV_VIRTUALENV_INIT=1
|
||||
|
||||
|
||||
@@ -16,6 +16,7 @@ setup() {
|
||||
unset PYENV_VIRTUALENV_DISABLE_PROMPT
|
||||
unset PYENV_VIRTUAL_ENV_DISABLE_PROMPT
|
||||
unset VIRTUAL_ENV_DISABLE_PROMPT
|
||||
unset PYENV_VIRTUALENV_PROMPT
|
||||
unset _OLD_VIRTUAL_PS1
|
||||
stub pyenv-hooks "activate : echo"
|
||||
}
|
||||
@@ -53,6 +54,35 @@ EOS
|
||||
teardown_conda "anaconda-2.3.0"
|
||||
}
|
||||
|
||||
@test "activate conda root from current version with custom prompt" {
|
||||
export PYENV_VIRTUALENV_INIT=1
|
||||
|
||||
setup_conda "anaconda-2.3.0"
|
||||
stub pyenv-version-name "echo anaconda-2.3.0"
|
||||
stub pyenv-virtualenv-prefix "anaconda-2.3.0 : echo \"${PYENV_ROOT}/versions/anaconda-2.3.0\""
|
||||
stub pyenv-prefix "anaconda-2.3.0 : echo \"${PYENV_ROOT}/versions/anaconda-2.3.0\""
|
||||
stub pyenv-sh-deactivate "--force --quiet : echo deactivated"
|
||||
|
||||
PYENV_SHELL="bash" PYENV_VERSION="anaconda-2.3.0" PYENV_VIRTUALENV_PROMPT='venv:{venv}' run pyenv-sh-activate
|
||||
|
||||
assert_success
|
||||
assert_output <<EOS
|
||||
deactivated
|
||||
export PYENV_VIRTUAL_ENV="${PYENV_ROOT}/versions/anaconda-2.3.0";
|
||||
export VIRTUAL_ENV="${PYENV_ROOT}/versions/anaconda-2.3.0";
|
||||
export CONDA_DEFAULT_ENV="root";
|
||||
export _OLD_VIRTUAL_PS1="\${PS1:-}";
|
||||
export PS1="venv:anaconda-2.3.0 \${PS1:-}";
|
||||
export CONDA_PREFIX="${TMP}/pyenv/versions/anaconda-2.3.0";
|
||||
EOS
|
||||
|
||||
unstub pyenv-version-name
|
||||
unstub pyenv-virtualenv-prefix
|
||||
unstub pyenv-prefix
|
||||
unstub pyenv-sh-deactivate
|
||||
teardown_conda "anaconda-2.3.0"
|
||||
}
|
||||
|
||||
@test "activate conda root from current version (fish)" {
|
||||
export PYENV_VIRTUALENV_INIT=1
|
||||
|
||||
|
||||
@@ -32,8 +32,8 @@ unstub_pyenv() {
|
||||
run pyenv-virtualenv venv
|
||||
|
||||
assert_success
|
||||
assert_output <<OUT
|
||||
PYENV_VERSION=miniconda3-3.16.0 conda create --name venv --yes python
|
||||
assert_output_wildcards <<OUT
|
||||
PYENV_VERSION=miniconda3-3.16.0 conda create --name venv --yes --file /dev/fd/*
|
||||
rehashed
|
||||
OUT
|
||||
|
||||
@@ -56,7 +56,7 @@ OUT
|
||||
|
||||
assert_success
|
||||
assert_output <<OUT
|
||||
PYENV_VERSION=miniconda3-3.16.0 conda create --name venv --yes python=3.5 python
|
||||
PYENV_VERSION=miniconda3-3.16.0 conda create --name venv --yes python=3.5
|
||||
rehashed
|
||||
OUT
|
||||
|
||||
@@ -79,7 +79,7 @@ OUT
|
||||
|
||||
assert_success
|
||||
assert_output <<OUT
|
||||
PYENV_VERSION=miniconda3-3.16.0 conda create --name venv --yes python=3.5 python
|
||||
PYENV_VERSION=miniconda3-3.16.0 conda create --name venv --yes python=3.5
|
||||
rehashed
|
||||
OUT
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
#!/usr/bin/env bats
|
||||
#!/usr/bin/env bats
|
||||
|
||||
load test_helper
|
||||
|
||||
|
||||
@@ -6,6 +6,7 @@ setup() {
|
||||
export PYENV_ROOT="${TMP}/pyenv"
|
||||
export HOOK_PATH="${TMP}/i has hooks"
|
||||
mkdir -p "$HOOK_PATH"
|
||||
unset PYENV_VIRTUALENV_PROMPT
|
||||
}
|
||||
|
||||
@test "pyenv-virtualenv hooks" {
|
||||
|
||||
@@ -83,6 +83,16 @@ assert_equal() {
|
||||
fi
|
||||
}
|
||||
|
||||
assert_equal_wildcards() {
|
||||
if [[ $1 != $2 ]]; then
|
||||
{ echo "expected:"
|
||||
echo "$2"
|
||||
echo "actual:"
|
||||
echo "$1"
|
||||
} | flunk
|
||||
fi
|
||||
}
|
||||
|
||||
assert_output() {
|
||||
local expected
|
||||
if [ $# -eq 0 ]; then expected="$(cat -)"
|
||||
@@ -91,6 +101,14 @@ assert_output() {
|
||||
assert_equal "$expected" "$output"
|
||||
}
|
||||
|
||||
assert_output_wildcards() {
|
||||
local expected
|
||||
if [ $# -eq 0 ]; then expected="$(cat -)"
|
||||
else expected="$1"
|
||||
fi
|
||||
assert_equal_wildcards "$output" "$expected"
|
||||
}
|
||||
|
||||
assert_output_contains() {
|
||||
local expected="$1"
|
||||
echo "$output" | grep -F "$expected" >/dev/null || {
|
||||
|
||||
Reference in New Issue
Block a user