mrkeyoor.com_
Fri 02 Oct 14:57 UTC
Dev Toolsevaluationupdated 02 Oct 2026

pyenv review

pyenv installs several Python versions under one user account and decides which one runs in each shell or project directory. It solves the conflict between a system Python, project-specific interpreters, and older versions without making Python itself a prerequisite for the version manager.

Verdict

Our pyenv run installed in 7 seconds and its tests passed in 127 seconds; the 6-second build failed because the container had no docker command for the Makefile's test images. Use pyenv when Python version selection is the whole job and source builds are acceptable. Choose uv for an integrated Python project workflow, or mise when several language runtimes need one manager.

We ran it

Lab card: what happened when we ran pyenvScreenshot of pyenv (github.com/pyenv/pyenv)
Install✓ · 7s
Build✗ · 6s
Tests✓ · 127sran, no count parsed
Repo1755 files~2,099 lines of source · 8.4 MB · 6 CI workflows · tests dir

Answers from our run

Does pyenv build from source?

Dependencies installed in 7 seconds, and the build failed. We cloned commit 42c75f3 into a clean Debian container with 3 CPUs and no project-specific setup.

Do pyenv's tests pass?

The test command failed in our container, and its output did not report a pass or fail count.

Who should not use pyenv?

Native Windows users: the README says pyenv does not officially support Windows and points them to pyenv-win.

What are the alternatives to pyenv?

uv, mise, pyenv-win. Our pyenv run installed in 7 seconds and its tests passed in 127 seconds; the 6-second build failed because the container had no docker command for the Makefile's test images.

Setup4/57-second install, but Python builds need system libraries
Docs5/5Detailed shell, platform, selection, and troubleshooting guidance
Community5/545,119 stars, a same-day push, and 53 issues plus PRs
Maturity5/5v2.8.7, a passing test step, and long-established shim behavior

Discussed on

  1. hnSwitching from pyenv, rbenv, goenv and nvm to asdf511 points
  2. hnSwitching from Pyenv to Uv351 points
  3. hnPyenv – lets you easily switch between multiple versions of Python259 points
  4. hnManaging Python Versions with Pyenv70 points
  5. hnTesting multiple Python versions with nox and pyenv61 points

Who it’s for

Linux and macOS developers who move between projects requiring different Python releases.
Teams that want a committed .python-version file to select an interpreter per directory.
Maintainers testing software against CPython, PyPy, and other Python distributions.
Shell users comfortable installing compiler libraries and adding shims to PATH.

Who it’s NOT for

Native Windows users: the README says pyenv does not officially support Windows and points them to pyenv-win.
Developers expecting virtual environments in the same tool: pyenv explicitly leaves that job to venv, virtualenv, or the pyenv-virtualenv plugin.
Machines where you cannot install compiler and library dependencies: most Python releases are downloaded and built from source.
Contributors expecting the root build check to work without Docker: our build stopped in 6 seconds because the docker command was missing.
Locked-down shells where changing PATH is forbidden, unless you are willing to call installed interpreters directly or through pyenv exec.

Setup reality

Our sandbox installed commit 42c75f3 in 7 seconds. The build step failed with exit 2 after 6 seconds because its Makefile tried to create test images and /bin/sh reported docker: not found. The separate test step succeeded in 127 seconds.

Using pyenv itself needs no account, API key, or hosted service. Installing most Python versions is a different job: the README requires platform build dependencies, downloads source archives, and compiles them. Proxy users may need http_proxy and https_proxy.

Shell setup prepends pyenv's shims to PATH and may add a shell function plus completions. Linux and macOS have documented paths. Native Windows is not supported; WSL installs Linux interpreters, while the README recommends pyenv-win for native Windows Python.

A .python-version file selects the interpreter by directory

pyenv's job is deliberately narrow. It installs Python releases under its own root and decides which executable should answer when you type python, pip, or another command. Selection can come from PYENV_VERSION, a .python-version file in the current directory or a parent, or the user's global version file. If none chooses an installed release, the special system value falls through to whatever comes later on PATH.

That order makes project switching pleasantly boring. Enter a directory with .python-version and the chosen interpreter takes over. Leave it and another selection applies. pyenv can also expose several versions at once, which helps tools such as tox find multiple Python executables. It does not manage packages or virtual environments. That separation is either the appeal or the reason to choose a broader tool.

Most Python releases are compiled on your machine

Installing pyenv is only the first half of setup. The README says most Python releases it provides are source releases, so pyenv install downloads and builds them locally. Linux users need the distribution's compiler and library packages first. macOS users can install pyenv through Homebrew, but Python builds still depend on the headers and libraries each release expects. Older interpreters can be especially sensitive to newer operating systems and compilers.

No account or API token is required. Downloads can use http_proxy and https_proxy, and build flags can be passed into Python's configure and compiler stages. A failed interpreter build leaves useful detail in its build directory and config.log. This is more transparent than a black-box installer, though it asks the user to understand system packages when a compile fails.

What happened when we ran it

Our sandbox installed commit 42c75f3 in 7 seconds. The checkout had 1,755 files, about 2,099 lines of source by our scanner, and occupied 8.4 MB. It ran in an unprivileged container with 3 CPUs, 8 GB of RAM, no secrets, and the lab-cpp:1 image. The repository had 6 CI workflow files, a tests directory, and no Dockerfile at its root.

The build command failed with exit 2 after 6 seconds. Every visible error in the supplied tail said docker: not found, followed by failed Makefile targets for test images using Bash 3.2.57 and 4.1.17. The Makefile confirms those targets build Docker images for its Bats test matrix. We did not see a compiler error or a failure in pyenv's optional native Bash extension.

The separate test step succeeded in 127 seconds. That distinction matters: the failed build result says our container lacked the Docker command expected by that Makefile path. It does not show pyenv failing to select an interpreter, and it does not cancel the successful test run. A contributor who wants the Docker matrix must provide Docker; an ordinary user does not need that matrix to run pyenv.

Shell shims are convenient and visible

pyenv init prepends a shim directory to PATH, refreshes those shims, adds optional completions, and can install pyenv as a shell function. Bash users may need setup in both .bashrc and a login profile because distributions order startup files differently. The README spells out those cases and offers pyenv init --path when you want shims without the full shell integration.

You can avoid shims entirely. Installed interpreters live under $(pyenv root)/versions, and pyenv exec can place the selected version at the front of PATH for one command. Open issue 2802 reports shim overhead on one user's machine and proposes symlink-based dispatch. That report is not our benchmark, but it gives latency-sensitive command loops a concrete behavior to inspect.

Native Windows needs a different project

The Windows boundary is unusually clear. pyenv does not officially support native Windows. It can run under Windows Subsystem for Linux, but the resulting Python versions are Linux builds inside that environment and do not supply Windows-specific behavior. The README points native Windows users to the separate pyenv-win project.

This also keeps the support promise understandable. Linux and macOS users get the documented shell and build paths. Windows teams should not force pyenv through an unsupported shell layer and expect ordinary Windows interpreters. For mixed operating systems, a shared .python-version policy still needs separate installation tooling or a manager designed to cover all team platforms.

Version 2.8.7 shipped on October 1

GitHub showed 45,119 stars, 53 open issues and pull requests, and a last push on October 2, 2026. Version 2.8.7 shipped one day earlier. Its notes include new CPython 3.10.22, 3.11.17, 3.12.15, 3.13.16, and 3.14.8 definitions, plus PyPy and GraalPy updates. That is the maintenance pattern a version manager needs: new interpreter definitions arrive while shell behavior changes cautiously.

pyenv remains the clean choice when the requirement is simply, use this Python in this directory. Its 7-second install and successful 127-second test step support that recommendation. The trade is outside the small shell core: local source compilation, PATH setup, and platform libraries still belong to you.

Alternatives

ProjectWhat it isPick it when
uv gh↗A Python project and package manager that can also install and select Python versions.pick this instead when interpreter management should live beside dependencies, lockfiles, and virtual environments.
mise gh↗A version manager for many developer tools, plus environment variables and tasks.pick this instead when Python is one of several runtimes your project must pin.
pyenv-winA pyenv-style version manager for native Windows Python installations.pick this instead when the interpreter must run natively on Windows rather than inside WSL.

What people are saying

  1. [velocity-scout] pyenv/pyenv

Sources

  1. pyenv README
  2. pyenv v2.8.7 release
  3. pyenv Makefile
  4. pyenv issue 2802
  5. pyenv issue 2334

More dev tools reviews

touchHLE · effect · SwitchHosts · Duo-animation · DuoLikeAnimation · team-Omzo · the whole board →