asdf vs pyenv
Which should you use? A side-by-side look at what each one does, who it suits, what it costs, how hard it is to set up, and where each falls short.
Open source · MIT
A command-line tool that manages multiple versions of languages like Ruby, Node.js and Elixir, using plugins.
Open source · MIT
A command-line tool for installing and switching between multiple Python versions.
The short answer
Choose asdf if you need…
- Developers who work on several projects that need different language versions
- Teams that want one version config file per project
- People moving from nvm, rbenv or pyenv who want to reuse their existing version files
Choose pyenv if you need…
- Developers who work on several Python projects that need different Python versions
- People testing code across multiple Python versions, for example with tox
- Linux and macOS users who want a per-user Python setup without touching system Python
Side-by-side
| asdf | pyenv | |
|---|---|---|
| Type | Dev tool | Dev tool |
| Price | Free and open source | Free and open source |
| Licence | MIT | MIT |
| GitHub stars | 25.6k | 45.2k |
| Setup difficulty | Beginner | Intermediate |
| How you get it | See the README | Download the app |
| Main language | Go | Shell |
| Last code update | 5 days ago | 5 days ago |
What each one is
asdf
asdf is a command-line tool that lets you install and switch between different versions of programming languages and runtimes on a per-project basis. You add support for each language by installing a plugin. The README says it works like tools such as nvm, rbenv and pyenv, but in one tool with one set of commands.
pyenv
pyenv is a command-line tool that lets you install several versions of Python on one computer and switch between them. You can set a global default for your user account, set a different version per project, or override it with an environment variable. It is built from shell scripts and works by placing a directory of small wrapper programs called shims on your PATH.
Best for
asdf
- Developers who work on several projects that need different language versions
- Teams that want one version config file per project
- People moving from nvm, rbenv or pyenv who want to reuse their existing version files
pyenv
- Developers who work on several Python projects that need different Python versions
- People testing code across multiple Python versions, for example with tox
- Linux and macOS users who want a per-user Python setup without touching system Python
Strengths
asdf
- One command set covers multiple languages through plugins
- Reads existing files such as .nvmrc and .ruby-version, which eases migration
- Supports shell completion for Bash, Zsh, Fish and Elvish
pyenv
- Simple, single-purpose design that follows the UNIX tradition, according to the README
- Written in pure shell scripts, so it does not depend on an existing Python install
- Supports several Python distributions, including CPython, PyPy, and Stackless Python
Not ideal for
asdf
- People who only use one language and one version, since a single-language version manager may be simpler
- Users who need a graphical interface, because the README describes a CLI tool only
pyenv
- Windows users, since the README says pyenv does not officially support Windows outside WSL; the maintainers point to pyenv-win instead
- People who want pyenv to also manage virtual environments, since the README says it does not do that; pyenv-virtualenv is a separate project
- Users who need native Windows Python builds, because the Pythons pyenv installs under WSL are Linux builds
Trade-offs
asdf
- Each language depends on its own plugin, so support quality varies by plugin (inferred from the plugin model described)
- The README is short and points to external docs for setup details, so the entry relies on those docs
pyenv
- Installing a Python version can require build dependencies, which the README covers in a separate wiki page
- Shell setup is needed so the shims and PATH changes take effect, and the README gives different steps for Bash and other shells
- No native Windows support; Windows users must use WSL or a fork
Getting started
asdf
Clone the repository
git clone https://github.com/asdf-vm/asdf.gitpyenv
Automatic installer (recommended, Linux/Unix)
curl -fsSL https://pyenv.run | bashInstall via Homebrew (macOS)
brew install pyenvFrequently asked questions
What is the difference between asdf and pyenv?
asdf: A command-line tool that manages multiple versions of languages like Ruby, Node.js and Elixir, using plugins. pyenv: A command-line tool for installing and switching between multiple Python versions. asdf suits developers who work on several projects that need different language versions, while pyenv suits developers who work on several python projects that need different python versions.
Are asdf and pyenv free?
asdf: Free and open source. pyenv: Free and open source.
Which is easier to set up, asdf or pyenv?
asdf is easier to get started with (rated beginner); pyenv is rated intermediate and usually needs more setup.
Is asdf or pyenv more popular?
pyenv has more GitHub stars (45.2k) than asdf (25.6k). Popularity isn't the same as fit — check which one matches your use case above.
What are other alternatives to asdf and pyenv?
Other options people compare them with include nvm, rbenv, mise, Oh My Posh, inshellisense.
Keep comparing
Built from our catalogue entries for both products: open-source details come from each project's README (AI-assisted, refreshed weekly) and GitHub data; AI-tool details are editorial. Spotted something wrong? Let us know from either product's page.