Skip to content

Commit 2d947be

Browse files
authored
Merge pull request #296 from pyenv/yy-py-venv-major-minor
Prefer `python3.x` executable if available
2 parents bfdeb31 + a9e1891 commit 2d947be

File tree

8 files changed

+56
-24
lines changed

8 files changed

+56
-24
lines changed

bin/pyenv-virtualenv

+16-6
Original file line numberDiff line numberDiff line change
@@ -101,14 +101,18 @@ http_get_wget() {
101101
}
102102

103103
version() {
104+
if [[ -z "${PYENV_VERSION:-}" ]]; then
105+
# `PYENV_VERSION` might not be declared if this was invoked via `--version`
106+
export PYENV_VERSION="$(pyenv-version-name)"
107+
fi
104108
detect_venv
105109
local version
106110
if [ -n "${USE_CONDA}" ]; then
107111
version="$(pyenv-exec conda --version 2>/dev/null || true)"
108112
echo "pyenv-virtualenv ${PYENV_VIRTUALENV_VERSION} (conda ${version:-unknown})"
109113
else
110114
if [ -n "$USE_M_VENV" ]; then
111-
echo "pyenv-virtualenv ${PYENV_VIRTUALENV_VERSION} (python -m venv)"
115+
echo "pyenv-virtualenv ${PYENV_VIRTUALENV_VERSION} (${M_VENV_PYTHON_BIN:-python} -m venv)"
112116
else
113117
version="$(pyenv-exec virtualenv --version 2>/dev/null || true)"
114118
echo "pyenv-virtualenv ${PYENV_VIRTUALENV_VERSION} (virtualenv ${version:-unknown})"
@@ -123,7 +127,7 @@ usage() {
123127
pyenv-exec conda create --help 2>/dev/null || true
124128
else
125129
if [ -n "${USE_M_VENV}" ]; then
126-
pyenv-exec python -m venv --help 2>/dev/null || true
130+
pyenv-exec "${M_VENV_PYTHON_BIN:-python}" -m venv --help 2>/dev/null || true
127131
else
128132
pyenv-exec virtualenv --help 2>/dev/null || true
129133
fi
@@ -141,9 +145,15 @@ detect_venv() {
141145
if [ -x "${prefix}/bin/virtualenv" ]; then
142146
HAS_VIRTUALENV=1
143147
fi
144-
if pyenv-exec python -m venv --help 1>/dev/null 2>&1; then
145-
HAS_M_VENV=1
146-
fi
148+
# Prefer `python3.x` executable if avaialble (#206, #282)
149+
local python
150+
for python in "python${PYENV_VERSION%.*}" "python${PYENV_VERSION%%.*}" "python"; do
151+
if pyenv-exec "${python}" -m venv --help 1>/dev/null 2>&1; then
152+
HAS_M_VENV=1
153+
M_VENV_PYTHON_BIN="${python}"
154+
break
155+
fi
156+
done
147157
fi
148158
# Use `python -m venv` only if there is venv available, virtualenv is not installed, and `-p` not given
149159
if [ -n "${HAS_CONDA}" ]; then
@@ -553,7 +563,7 @@ if [ -n "${USE_CONDA}" ]; then
553563
pyenv-exec conda create $QUIET $VERBOSE --name "${VIRTUALENV_PATH##*/}" --yes "${VIRTUALENV_OPTIONS[@]}" python || STATUS="$?"
554564
else
555565
if [ -n "${USE_M_VENV}" ]; then
556-
pyenv-exec python -m venv $QUIET $VERBOSE "${VIRTUALENV_OPTIONS[@]}" "${VIRTUALENV_PATH}" || STATUS="$?"
566+
pyenv-exec "${M_VENV_PYTHON_BIN:-python}" -m venv $QUIET $VERBOSE "${VIRTUALENV_OPTIONS[@]}" "${VIRTUALENV_PATH}" || STATUS="$?"
557567
else
558568
pyenv-exec virtualenv $QUIET $VERBOSE "${VIRTUALENV_OPTIONS[@]}" "${VIRTUALENV_PATH}" || STATUS="$?"
559569
fi

test/envs.bats

+3-3
Original file line numberDiff line numberDiff line change
@@ -25,15 +25,15 @@ unstub_pyenv() {
2525
stub pyenv-version-name "echo '${PYENV_VERSION}'"
2626
stub pyenv-prefix " : echo '${PYENV_ROOT}/versions/${PYENV_VERSION}'"
2727
stub pyenv-virtualenv-prefix " : false"
28-
stub pyenv-exec "python -m venv --help : true"
29-
stub pyenv-exec "python -m venv * : echo PYENV_VERSION=\${PYENV_VERSION} \"\$@\";mkdir -p \${PYENV_ROOT}/versions/3.5.1/envs/venv/bin"
28+
stub pyenv-exec "python3.5 -m venv --help : true"
29+
stub pyenv-exec "python3.5 -m venv * : echo PYENV_VERSION=\${PYENV_VERSION} \"\$@\";mkdir -p \${PYENV_ROOT}/versions/3.5.1/envs/venv/bin"
3030
stub pyenv-exec "python -s -m ensurepip : echo PYENV_VERSION=\${PYENV_VERSION} \"\$@\";touch \${PYENV_ROOT}/versions/3.5.1/envs/venv/bin/pip"
3131

3232
run pyenv-virtualenv venv
3333

3434
assert_success
3535
assert_output <<OUT
36-
PYENV_VERSION=3.5.1 python -m venv ${PYENV_ROOT}/versions/3.5.1/envs/venv
36+
PYENV_VERSION=3.5.1 python3.5 -m venv ${PYENV_ROOT}/versions/3.5.1/envs/venv
3737
PYENV_VERSION=3.5.1/envs/venv python -s -m ensurepip
3838
rehashed
3939
OUT

test/hooks.bats

+1-1
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ OUT
1717
create_executable "3.5.1" "virtualenv"
1818
stub pyenv-prefix "echo '${PYENV_ROOT}/versions/3.5.1'"
1919
stub pyenv-prefix "echo '${PYENV_ROOT}/versions/3.5.1'"
20-
stub pyenv-exec "python -m venv --help : true"
20+
stub pyenv-exec "python3.5 -m venv --help : true"
2121
stub pyenv-hooks "virtualenv : echo '$HOOK_PATH'/virtualenv.bash"
2222
stub pyenv-exec "echo PYENV_VERSION=3.5.1 \"\$@\""
2323
stub pyenv-exec "echo PYENV_VERSION=3.5.1 \"\$@\""

test/pip.bats

+6-6
Original file line numberDiff line numberDiff line change
@@ -26,15 +26,15 @@ unstub_pyenv() {
2626
stub_pyenv "${PYENV_VERSION}"
2727
stub pyenv-prefix " : echo '${PYENV_ROOT}/versions/${PYENV_VERSION}'"
2828
stub pyenv-virtualenv-prefix " : false"
29-
stub pyenv-exec "python -m venv --help : true"
30-
stub pyenv-exec "python -m venv * : echo PYENV_VERSION=\${PYENV_VERSION} \"\$@\";mkdir -p \${PYENV_ROOT}/versions/3.5.1/envs/venv/bin"
29+
stub pyenv-exec "python3.5 -m venv --help : true"
30+
stub pyenv-exec "python3.5 -m venv * : echo PYENV_VERSION=\${PYENV_VERSION} \"\$@\";mkdir -p \${PYENV_ROOT}/versions/3.5.1/envs/venv/bin"
3131
stub pyenv-exec "python -s -m ensurepip : echo PYENV_VERSION=\${PYENV_VERSION} \"\$@\";touch \${PYENV_ROOT}/versions/3.5.1/envs/venv/bin/pip"
3232

3333
run pyenv-virtualenv venv
3434

3535
assert_success
3636
assert_output <<OUT
37-
PYENV_VERSION=3.5.1 python -m venv ${PYENV_ROOT}/versions/3.5.1/envs/venv
37+
PYENV_VERSION=3.5.1 python3.5 -m venv ${PYENV_ROOT}/versions/3.5.1/envs/venv
3838
PYENV_VERSION=3.5.1/envs/venv python -s -m ensurepip
3939
rehashed
4040
OUT
@@ -52,8 +52,8 @@ OUT
5252
stub_pyenv "${PYENV_VERSION}"
5353
stub pyenv-prefix " : echo '${PYENV_ROOT}/versions/${PYENV_VERSION}'"
5454
stub pyenv-virtualenv-prefix " : false"
55-
stub pyenv-exec "python -m venv --help : true"
56-
stub pyenv-exec "python -m venv * : echo PYENV_VERSION=\${PYENV_VERSION} \"\$@\";mkdir -p \${PYENV_ROOT}/versions/3.3.6/envs/venv/bin"
55+
stub pyenv-exec "python3.3 -m venv --help : true"
56+
stub pyenv-exec "python3.3 -m venv * : echo PYENV_VERSION=\${PYENV_VERSION} \"\$@\";mkdir -p \${PYENV_ROOT}/versions/3.3.6/envs/venv/bin"
5757
stub pyenv-exec "python -s -m ensurepip : false"
5858
stub pyenv-exec "python -s */get-pip.py : echo PYENV_VERSION=\${PYENV_VERSION} \"\$@\";touch \${PYENV_ROOT}/versions/3.3.6/envs/venv/bin/pip"
5959
stub curl true
@@ -62,7 +62,7 @@ OUT
6262

6363
assert_success
6464
assert_output <<OUT
65-
PYENV_VERSION=3.3.6 python -m venv ${PYENV_ROOT}/versions/3.3.6/envs/venv
65+
PYENV_VERSION=3.3.6 python3.3 -m venv ${PYENV_ROOT}/versions/3.3.6/envs/venv
6666
Installing pip from https://bootstrap.pypa.io/3.3/get-pip.py...
6767
PYENV_VERSION=3.3.6/envs/venv python -s ${TMP}/pyenv/cache/get-pip.py
6868
rehashed

test/python.bats

+4
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,8 @@ teardown() {
3131
create_executable "2.7.8" "python2.7"
3232
remove_executable "2.7.9" "python2.7"
3333

34+
stub pyenv-exec "python2.7 -m venv --help : false"
35+
stub pyenv-exec "python2 -m venv --help : false"
3436
stub pyenv-exec "python -m venv --help : false"
3537
stub pyenv-exec "virtualenv --verbose * : echo PYENV_VERSION=\${PYENV_VERSION} \"\$@\""
3638
stub pyenv-exec "python -s -m ensurepip : true"
@@ -56,6 +58,8 @@ OUT
5658
remove_executable "2.7.8" "python2.7"
5759
create_executable "2.7.9" "python2.7"
5860

61+
stub pyenv-exec "python2.7 -m venv --help : false"
62+
stub pyenv-exec "python2 -m venv --help : false"
5963
stub pyenv-exec "python -m venv --help : false"
6064
stub pyenv-exec "virtualenv --verbose * : echo PYENV_VERSION=\${PYENV_VERSION} \"\$@\""
6165
stub pyenv-exec "python -s -m ensurepip : true"

test/pyvenv.bats

+10-6
Original file line numberDiff line numberDiff line change
@@ -26,14 +26,14 @@ unstub_pyenv() {
2626
stub_pyenv "${PYENV_VERSION}"
2727
stub pyenv-prefix " : echo '${PYENV_ROOT}/versions/${PYENV_VERSION}'"
2828
stub pyenv-virtualenv-prefix " : false"
29-
stub pyenv-exec "python -m venv --help : true"
30-
stub pyenv-exec "python -m venv * : echo PYENV_VERSION=\${PYENV_VERSION} \"\$@\""
29+
stub pyenv-exec "python3.5 -m venv --help : true"
30+
stub pyenv-exec "python3.5 -m venv * : echo PYENV_VERSION=\${PYENV_VERSION} \"\$@\""
3131
stub pyenv-exec "python -s -m ensurepip : true"
3232

3333
run pyenv-virtualenv venv
3434

3535
assert_output <<OUT
36-
PYENV_VERSION=3.5.1 python -m venv ${PYENV_ROOT}/versions/3.5.1/envs/venv
36+
PYENV_VERSION=3.5.1 python3.5 -m venv ${PYENV_ROOT}/versions/3.5.1/envs/venv
3737
rehashed
3838
OUT
3939
assert [ -x "${PYENV_ROOT}/versions/3.5.1/envs/venv/bin/pydoc" ]
@@ -52,7 +52,7 @@ OUT
5252
stub_pyenv "${PYENV_VERSION}"
5353
stub pyenv-prefix " : echo '${PYENV_ROOT}/versions/${PYENV_VERSION}'"
5454
stub pyenv-virtualenv-prefix " : false"
55-
stub pyenv-exec "python -m venv --help : true"
55+
stub pyenv-exec "python3.5 -m venv --help : true"
5656
stub pyenv-exec "virtualenv * : echo PYENV_VERSION=\${PYENV_VERSION} \"\$@\""
5757
stub pyenv-exec "python -s -m ensurepip : true"
5858

@@ -77,6 +77,8 @@ OUT
7777
stub_pyenv "${PYENV_VERSION}"
7878
stub pyenv-prefix " : echo '${PYENV_ROOT}/versions/${PYENV_VERSION}'"
7979
stub pyenv-virtualenv-prefix " : false"
80+
stub pyenv-exec "python3.2 -m venv --help : false"
81+
stub pyenv-exec "python3 -m venv --help : false"
8082
stub pyenv-exec "python -m venv --help : false"
8183
stub pyenv-exec "pip install virtualenv* : echo PYENV_VERSION=\${PYENV_VERSION} \"\$@\""
8284
stub pyenv-exec "virtualenv * : echo PYENV_VERSION=\${PYENV_VERSION} \"\$@\""
@@ -103,7 +105,7 @@ OUT
103105
stub_pyenv "${PYENV_VERSION}"
104106
stub pyenv-prefix " : echo '${PYENV_ROOT}/versions/${PYENV_VERSION}'"
105107
stub pyenv-virtualenv-prefix " : false"
106-
stub pyenv-exec "python -m venv --help : true"
108+
stub pyenv-exec "python3.5 -m venv --help : true"
107109
stub pyenv-exec "pip install virtualenv : echo PYENV_VERSION=\${PYENV_VERSION} \"\$@\""
108110
stub pyenv-exec "virtualenv * : echo PYENV_VERSION=\${PYENV_VERSION} \"\$@\""
109111
stub pyenv-exec "python -s -m ensurepip : true"
@@ -130,7 +132,7 @@ OUT
130132
stub_pyenv "${PYENV_VERSION}"
131133
stub pyenv-prefix " : echo '${PYENV_ROOT}/versions/${PYENV_VERSION}'"
132134
stub pyenv-virtualenv-prefix " : false"
133-
stub pyenv-exec "python -m venv --help : true"
135+
stub pyenv-exec "python3.5 -m venv --help : true"
134136
stub pyenv-exec "pip install virtualenv : echo PYENV_VERSION=\${PYENV_VERSION} \"\$@\""
135137
stub pyenv-exec "virtualenv * : echo PYENV_VERSION=\${PYENV_VERSION} \"\$@\""
136138
stub pyenv-exec "python -s -m ensurepip : true"
@@ -157,6 +159,8 @@ OUT
157159
stub_pyenv "${PYENV_VERSION}"
158160
stub pyenv-prefix " : echo '${PYENV_ROOT}/versions/${PYENV_VERSION}'"
159161
stub pyenv-virtualenv-prefix " : false"
162+
stub pyenv-exec "python3.2 -m venv --help : false"
163+
stub pyenv-exec "python3 -m venv --help : false"
160164
stub pyenv-exec "python -m venv --help : false"
161165
stub pyenv-exec "pip install virtualenv* : echo PIP_REQUIRE_VENV=\${PIP_REQUIRE_VENV} PYENV_VERSION=\${PYENV_VERSION} \"\$@\""
162166
stub pyenv-exec "virtualenv * : echo PIP_REQUIRE_VENV=\${PIP_REQUIRE_VENV} PYENV_VERSION=\${PYENV_VERSION} \"\$@\""

test/version.bats

+6-2
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,9 @@ setup() {
99
@test "display virtualenv version" {
1010
setup_virtualenv "2.7.7"
1111
stub pyenv-prefix "echo '${PYENV_ROOT}/versions/2.7.7'"
12+
stub pyenv-version-name "echo 2.7.7"
13+
stub pyenv-exec "python2.7 -m venv --help : false"
14+
stub pyenv-exec "python2 -m venv --help : false"
1215
stub pyenv-exec "python -m venv --help : false"
1316
stub pyenv-exec "virtualenv --version : echo \"1.11\""
1417

@@ -24,13 +27,14 @@ setup() {
2427

2528
@test "display venv version" {
2629
setup_m_venv "3.4.1"
30+
stub pyenv-version-name "echo 3.4.1"
2731
stub pyenv-prefix "echo '${PYENV_ROOT}/versions/3.4.1'"
28-
stub pyenv-exec "python -m venv --help : true"
32+
stub pyenv-exec "python3.4 -m venv --help : true"
2933

3034
run pyenv-virtualenv --version
3135

3236
assert_success
33-
[[ "$output" == "pyenv-virtualenv "?.?.?" (python -m venv)" ]]
37+
[[ "$output" == "pyenv-virtualenv "?.?.?" (python3.4 -m venv)" ]]
3438

3539
unstub pyenv-prefix
3640
teardown_m_venv "3.4.1"

test/virtualenv.bats

+10
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,8 @@ unstub_pyenv() {
2626
export PYENV_VERSION="2.7.11"
2727
stub_pyenv "${PYENV_VERSION}"
2828
stub pyenv-virtualenv-prefix " : false"
29+
stub pyenv-exec "python2.7 -m venv --help : false"
30+
stub pyenv-exec "python2 -m venv --help : false"
2931
stub pyenv-exec "python -m venv --help : false"
3032
stub pyenv-exec "virtualenv * : echo PYENV_VERSION=\${PYENV_VERSION} \"\$@\""
3133
stub pyenv-exec "python -s -m ensurepip : false"
@@ -53,6 +55,8 @@ OUT
5355
stub_pyenv "${PYENV_VERSION}"
5456
stub pyenv-version-name "echo \${PYENV_VERSION}"
5557
stub pyenv-virtualenv-prefix " : false"
58+
stub pyenv-exec "python2.7 -m venv --help : false"
59+
stub pyenv-exec "python2 -m venv --help : false"
5660
stub pyenv-exec "python -m venv --help : false"
5761
stub pyenv-exec "virtualenv * : echo PYENV_VERSION=\${PYENV_VERSION} \"\$@\""
5862
stub pyenv-exec "python -s -m ensurepip : false"
@@ -81,6 +85,8 @@ OUT
8185
stub_pyenv "${PYENV_VERSION}"
8286
stub pyenv-version-name "echo \${PYENV_VERSION}"
8387
stub pyenv-virtualenv-prefix " : false"
88+
stub pyenv-exec "python2.7 -m venv --help : false"
89+
stub pyenv-exec "python2 -m venv --help : false"
8490
stub pyenv-exec "python -m venv --help : false"
8591
stub pyenv-exec "virtualenv * : echo PYENV_VERSION=\${PYENV_VERSION} \"\$@\""
8692
stub pyenv-exec "python -s -m ensurepip : false"
@@ -109,6 +115,8 @@ OUT
109115
stub_pyenv "${PYENV_VERSION}"
110116
stub pyenv-version-name "echo \${PYENV_VERSION}"
111117
stub pyenv-virtualenv-prefix " : false"
118+
stub pyenv-exec "python2.7 -m venv --help : false"
119+
stub pyenv-exec "python2 -m venv --help : false"
112120
stub pyenv-exec "python -m venv --help : false"
113121
stub pyenv-exec "virtualenv * : echo PYENV_VERSION=\${PYENV_VERSION} \"\$@\""
114122
stub pyenv-exec "python -s -m ensurepip : false"
@@ -172,6 +180,8 @@ OUT
172180
export PYENV_VERSION="2.7.11"
173181
stub_pyenv "${PYENV_VERSION}"
174182
stub pyenv-virtualenv-prefix " : false"
183+
stub pyenv-exec "python2.7 -m venv --help : false"
184+
stub pyenv-exec "python2 -m venv --help : false"
175185
stub pyenv-exec "python -m venv --help : false"
176186
stub pyenv-exec "virtualenv * : echo PYENV_VERSION=\${PYENV_VERSION} \"\$@\""
177187
stub pyenv-exec "python -s -m ensurepip : false"

0 commit comments

Comments
 (0)