What is the difference between venv, pyvenv, pyenv, virtualenv, virtualenvwrapper, pipenv, etc?
PyPI packages not in the standard library:
virtualenvis a very popular tool that creates isolated Python environments for Python libraries. If you’re not familiar with this tool, I highly recommend learning it, as it is a very useful tool, and I’ll be making comparisons to it for the rest of this answer.
It works by installing a bunch of files in a directory (eg:
env/), and then modifying the
PATHenvironment variable to prefix it with a custom
env/bin/). An exact copy of the
python3binary is placed in this directory, but Python is programmed to look for libraries relative to its path first, in the environment directory. It’s not part of Python’s standard library, but is officially blessed by the PyPA (Python Packaging Authority). Once activated, you can install packages in the virtual environment using
pyenvis used to isolate Python versions. For example, you may want to test your code against Python 2.7, 3.6, 3.7 and 3.8, so you’ll need a way to switch between them. Once activated, it prefixes the
PATHenvironment variable with
~/.pyenv/shims, where there are special files matching the Python commands (
pip). These are not copies of the Python-shipped commands; they are special scripts that decide on the fly which version of Python to run based on the
PYENV_VERSIONenvironment variable, or the
.python-versionfile, or the
pyenvalso makes the process of downloading and installing multiple Python versions easier, using the command
pyenv-virtualenvis a plugin for
pyenvby the same author as
pyenv, to allow you to use
virtualenvat the same time conveniently. However, if you’re using Python 3.3 or later,
pyenv-virtualenvwill try to run
python -m venvif it is available, instead of
virtualenv. You can use
pyenv-virtualenv, if you don’t want the convenience features.
virtualenvwrapperis a set of extensions to
virtualenv(see docs). It gives you commands like
lssitepackages, and especially
workonfor switching between different
virtualenvdirectories. This tool is especially useful if you want multiple
pyenv-virtualenvwrapperis a plugin for
pyenvby the same author as
pyenv, to conveniently integrate
pipenvaims to combine
virtualenvinto one command on the command-line. The
virtualenvdirectory typically gets placed in
XXXbeing a hash of the path of the project directory. This is different from
virtualenv, where the directory is typically in the current working directory.
pipenvis meant to be used when developing Python applications (as opposed to libraries). There are alternatives to
pipenv, such as
poetry, which I won’t list here since this question is only about the packages that are similarly named.
pyvenvis a script shipped with Python 3 but deprecated in Python 3.6 as it had problems (not to mention the confusing name). In Python 3.6+, the exact equivalent is
python3 -m venv.
venvis a package shipped with Python 3, which you can run using
python3 -m venv(although for some reason some distros separate it out into a separate distro package, such as
python3-venvon Ubuntu/Debian). It serves the same purpose as
virtualenv, but only has a subset of its features (see a comparison here).
virtualenvcontinues to be more popular than
venv, especially since the former supports both Python 2 and 3.
Recommendation for beginners:
This is my personal recommendation for beginners: start by learning
pip, tools which work with both Python 2 and 3 and in a variety of situations, and pick up other tools once you start needing them.