Python Virtual Environments#

For Python 3.3 and later versions, PEP 405 introduced interpreter level support for the concept of “Python Virtual Environments”. Each virtual environment has its own Python binary (allowing creation of environments with various Python versions) and can have its own independent set of installed Python packages in its site directories, but shares the standard library with the base installed Python. While the concept of virtual environments existed prior to this update, there was no previously standardised mechanism for declaring or discovering them.

Runtime detection of virtual environments#

At runtime, virtual environments can be identified by virtue of sys.prefix (the filesystem location of the running interpreter) having a different value from sys.base_prefix (the default filesystem location of the standard library directories).

How venvs work in the Python standard library documentation for the venv module covers this along with the concept of “activating” a virtual environment in an interactive operating system shell (this activation step is optional and hence the changes it makes can’t be reliably used to detect whether a Python program is running in a virtual environment or not).

Declaring installation environments as Python virtual environments#

As described in PEP 405, a Python virtual environment in its simplest form consists of nothing more than a copy or symlink of the Python binary accompanied by a site-packages directory and a pyvenv.cfg file with a home key that indicates where to find the Python standard library modules.

While designed to meet the needs of the standard venv module, this split installation and pyvenv.cfg file approach can be used by any Python installation provider that desires Python-specific tools to be aware that they are already operating in a virtual environment and no further environment nesting is required or desired.

Even in the absence of a pyvenv.cfg file, any approach (e.g. sitecustomize.py, patching the installed Python runtime) that results in sys.prefix and sys.base_prefix having different values, while still providing a matching default package installation scheme in sysconfig, will be detected and behave as a Python virtual environment.

History#

  • May 2012: This specification was approved through PEP 405.