VIRTUALENV(1) virtualenv VIRTUALENV(1) (NAME) virtualenv - [: PyPI] [] [: PyPI] [] [: PyPI] [] [: ] [] [: ] [] [: PyPI] [] [: PyPI] [] [: ] [] [: ] [] [: ] [] virtualenv . . venv . virtualenv venv (Explanation) <> . (QUICK NAVIGATION) Tutorials () - o (Getting started) <> -- How-to guides ( ) - o virtualenv <> -- virtualenv o virtualenv <> -- Reference () - o (Compatibility) <> -- o (Command line) <> -- o (Python) <> -- (API) Explanation () - o (Explanation) <> -- virtualenv Extensions () o (Plugins) <> -- virtualenv creators seeders activators virtualenv : o virtualenvwrapper -- o pew -- (Python Env Wrapper) o tox -- o nox -- (EXTERNAL RESOURCES) virtualenv : o virtualenv (Corey Schafer) -- o (Bernat Gabor) -- o (Carl Meyer) -- virtualenv (Getting started) virtualenv . . (Prerequisites) : o 3.9 . pyenv mise asdf virtualenv . o virtualenv ( Install virtualenv <> ). (Create your first virtual environment) myproject : $ virtualenv myproject created virtual environment CPython3.13.2.final.0-64 in 200ms creator CPython3Posix(dest=/home/user/myproject, clear=False, no_vcs_ignore=False, global=False) seeder FromAppData(download=False, pip=bundle, setuptools=bundle, via=copy, app_data_dir=/home/user/.cache/virtualenv) activators BashActivator,CShellActivator,FishActivator,NushellActivator,PowerShellActivator,PythonActivator myproject pip . : $ ls myproject/bin/python* myproject/bin/python myproject/bin/python3 myproject/bin/python3.13 (Environment layout) <> . (Activate the environment) . : [Linux/macOS] $ source myproject/bin/activate [Windows (PowerShell)] PS> .\myproject\Scripts\Activate.ps1 [Windows (CMD)] C:\> .\myproject\Scripts\activate.bat (prompt) : (myproject) $ : [Linux/macOS] (myproject) $ which python /home/user/myproject/bin/python [Windows (PowerShell)] (myproject) PS> where.exe python C:\Users\user\myproject\Scripts\python.exe [Windows (CMD)] (myproject) C:\> where.exe python C:\Users\user\myproject\Scripts\python.exe pip : (myproject) $ pip install requests Collecting requests Using cached requests-2.32.3-py3-none-any.whl (64 kB) Installing collected packages: requests Successfully installed requests-2.32.3 : (myproject) $ python -c "import requests; print(requests.__file__)" /home/user/myproject/lib/python3.13/site-packages/requests/__init__.py requests Python . : (myproject) $ deactivate $ Python Python . . : [Linux/macOS] $ myproject/bin/python -c "import sys; print(sys.prefix)" /home/user/myproject $ myproject/bin/pip install httpx [Windows (PowerShell)] PS> .\myproject\Scripts\python.exe -c "import sys; print(sys.prefix)" C:\Users\user\myproject PS> .\myproject\Scripts\pip.exe install httpx [Windows (CMD)] C:\> .\myproject\Scripts\python.exe -c "import sys; print(sys.prefix)" C:\Users\user\myproject C:\> .\myproject\Scripts\pip.exe install httpx CI ..SS : $ mkdir myapp && cd myapp $ virtualenv venv $ source venv/bin/activate # or use the appropriate command for your platform (venv) $ pip install flask requests (venv) $ pip freeze > requirements.txt requirements.txt : blinker==1.9.0 certifi==2025.1.31 charset-normalizer==3.4.1 click==8.1.8 flask==3.1.0 idna==3.10 itsdangerous==2.2.0 Jinja2==3.1.5 MarkupSafe==3.0.2 requests==2.32.3 urllib3==2.3.0 werkzeug==3.1.3 . : (venv) $ deactivate $ rm -rf venv $ virtualenv venv $ source venv/bin/activate (venv) $ pip install -r requirements.txt . : [graph] : o virtualenv . o . o . o pip freeze . o requirements.txt . : o Use virtualenv <> . o Explanation <> virtualenv venv. o Command line <> . virtualenv virtualenv . : o uv -- . uv . o pipx -- . pipx . o pip -- . --user . . o zipapp -- . CI . [graph][uv] virtualenv uv : $ uv tool install virtualenv : $ uv tool install git+https://github.com/pypa/virtualenv.git@main [pipx] virtualenv pipx : $ pipx install virtualenv : $ pipx install git+https://github.com/pypa/virtualenv.git@main [pip] virtualenv pip : $ python -m pip install --user virtualenv : $ python -m pip install git+https://github.com/pypa/virtualenv.git@main : . (externally-managed) uv tool pipx . [zipapp] zipapp : $ python virtualenv.pyz --help https://bootstrap.pypa.io/virtualenv/x.y/virtualenv.pyz ..SS : $ virtualenv --version Python Compatibility <> . virtualenv Python virtualenv Python . --python -p . Python : $ virtualenv -p python3.14 venv $ virtualenv -p 3.10 venv $ virtualenv -p pypy3 venv $ virtualenv -p rustpython venv PEP 440 PEP 440 Python : $ virtualenv --python ">=3.12" venv $ virtualenv --python "~=3.11.0" venv $ virtualenv --python "cpython>=3.10" venv o >=3.12 -- Python 3.12 . o ~=3.11.0 -- >=3.11.0, <3.12.0 ( 3.11.x). o cpython>=3.10 -- CPython 3.10 . Python free-threading Python free-threading : $ virtualenv -p 3.13t venv -- Apple Silicon ( arm64 + x86_64 Rosetta) Windows on ARM -- : $ virtualenv -p cpython3.12-64-arm64 venv $ virtualenv -p 3.11-64-x86_64 venv amd64 x86_64 aarch64 arm64. ( ). Python: $ virtualenv -p /usr/bin/python3.9 venv --try-first-with . --python . --python . $ virtualenv --python ">=3.10" --try-first-with /usr/bin/python3.9 venv /usr/bin/python3.9 >=3.10 . (pyenv mise asdf) virtualenv (shims) pyenv mise asdf . virtualenv : $ pyenv local 3.12.0 $ virtualenv venv # uses pyenv's 3.12.0, not the system Python $ PYENV_VERSION=3.11.0 virtualenv venv # uses 3.11.0 mise asdf : $ mise use python@3.12 $ virtualenv venv . (shim resolution) Explanation <> . PATH . [Bash/Zsh] $ source venv/bin/activate [Fish] $ source venv/bin/activate.fish [PowerShell] PS> .\venv\Scripts\Activate.ps1 : execution policy Set-ExecutionPolicy RemoteSigned . [CMD] > .\venv\Scripts\activate.bat [Nushell] $ overlay use venv/bin/activate.nu [Xonsh] @ source venv/bin/activate.xsh : $ deactivate : $ venv/bin/python script.py $ venv/bin/pip install package python python3 .exe venv\Scripts . pythonw.exe . <> . (Prompt) : $ virtualenv --prompt myproject venv VIRTUAL_ENV_DISABLE_PROMPT. VIRTUAL_ENV_PROMPT. (Programmatic) activate_this.py. sys.path (import) . import runpy runpy.run_path("venv/bin/activate_this.py") WSGI ( mod_wsgi uWSGI) : import runpy from pathlib import Path runpy.run_path(str(Path("/var/www/myapp/venv/bin/activate_this.py"))) from myapp import create_app # noqa: E402 application = create_app() virtualenv. virtualenv.ini app config platformdirs . virtualenv --help . VIRTUALENV_CONFIG_FILE..SS - - _ : [virtualenv] python = /opt/python-3.14/bin/python : [virtualenv] extra_search_dir = /path/to/dists /path/to/other/dists VIRTUALENV_ : $ export VIRTUALENV_PYTHON=/opt/python-3.14/bin/python . app-data VIRTUALENV_OVERRIDE_APP_DATA (cache) app-data . HTTPS https://pypi.org/pypi//json (seed wheels) . TLS virtualenv . VIRTUALENV_PERIODIC_UPDATE_INSECURE=1 (context) SSL . (trust stores) . ( ): [graph] (seed packages) wheel wheel : $ virtualenv --upgrade-embed-wheels wheel wheel : $ virtualenv --extra-search-dir /path/to/wheels venv PyPI (seed packages) PyPI : $ virtualenv --download venv (seed packages): $ virtualenv --no-periodic-update venv virtualenv.seed.wheels.embed (patch) PERIODIC_UPDATE_ON_BY_DEFAULT False . Explanation <> . Python virtualenv Python cli_run: from virtualenv import cli_run cli_run(["venv"]) : cli_run(["-p", "python3.14", "--without-pip", "myenv"]) session : result = cli_run(["venv"]) print(result.creator.dest) # path to created environment print(result.creator.exe) # path to python executable session_via_cli : from virtualenv import session_via_cli session = session_via_cli(["venv"]) # inspect session.creator, session.seeder, session.activators API Python <> . Python virtualenv Python . (patch) (minor) (best effort) . CPython 3.15 >= python_version >= 3.9 PyPy 3.11 >= python_version >= 3.9 GraalPy 24.1 ( Linux macOS). RustPython (Linux macOS Windows). RustPython Python 3.14 ..SS (Support policy) o . o (EOL) CPython . (Version support timeline) : o 21.5.0 (2026-06-13): Python 3.8 . o 20.27.0 (2024-10-17): Python 3.7 . o 20.22.0 (2023-04-19): Python 3.6 . o 20.18.0 (2023-02-06): Python 3.6 . (Supported operating systems) CPython . . . (feature request) . (Cross-platform) Python Linux macOS Windows : o python.org o python-build-standalone ( uv mise ) o Python pyenv mise asdf ( shim ) (Linux) o Ubuntu 16.04 ( deadsnakes ) o Fedora o RHEL CentOS o OpenSuse o Arch Linux (macOS) o Python Homebrew ( -- Homebrew Python ) o Python 3 XCode ( Python /Library/Frameworks/Python3.framework/) : (Framework) . (symlink) (hardlink) . (Windows) o Python 3.9 Windows Store (Command line) virtualenv . : . Python Use virtualenv <> . (Command line options) virtualenv [OPTIONS] +----------------------------------+--------------------------+-----------------------------------+ | | | | | | | | +----------------------------------+--------------------------+-----------------------------------+ |--version | '==SUPPRESS==' | | | | | virtualenv | | | | | | | | | +----------------------------------+--------------------------+-----------------------------------+ |--with-traceback | False | | | | | | | | | (stacktrace) | | | | virtualenv | | | | | | | | | +----------------------------------+--------------------------+-----------------------------------+ |--read-only-app-data | False | | | | | | | | | | | | | | | | | | | | | | | | | ( | | | | | | | | | | | | ) | +----------------------------------+--------------------------+-----------------------------------+ |--app-data | | | | | | | | | | virtualenv | | | | | | | | (cache) | | | | | +----------------------------------+--------------------------+-----------------------------------+ |--reset-app-data | False | | | | | | | | | | | | | | | | | | +----------------------------------+--------------------------+-----------------------------------+ |--upgrade-embed-wheels | False | | | | | | | | | | | | | (wheels) | | | | | +----------------------------------+--------------------------+-----------------------------------+ +------------------------------------+-----------------------+------------------------------------------------------------------+ | | | | |(verbosity) => verbosity = verbose | | | |- quiet | | | |INFO => | | | |CRITICAL=0, ERROR=1, WARNING=2, | | | |INFO=3, DEBUG=4, NOTSET=5 | | | +------------------------------------+-----------------------+------------------------------------------------------------------+ |-v, --verbose | 2 | | | | | | +------------------------------------+-----------------------+------------------------------------------------------------------+ |-q, --quiet | 0 | | |" (discovery)" | | | |box center; | | | |l|l|l. | | | |core => | | | | | | | | | | | | | | | | (discovery) | | | +------------------------------------+-----------------------+------------------------------------------------------------------+ |--discovery | 'builtin' | | | | | : builtin | +------------------------------------+-----------------------+------------------------------------------------------------------+ |-p, --python | | | | | | | | | | (//) | | | virtualenv | - | | | | | | | | - | | | | | | | | . | | | | ( >=3.12 ~=3.11.0 | | | | ==3.10) | +------------------------------------+-----------------------+------------------------------------------------------------------+ |--try-first-with | [] | | | | | | | | | | +------------------------------------+-----------------------+------------------------------------------------------------------+ (creator) +----------------------------+-----------------+--------------------------------------+ |core => | | | | | | | | | | | | | | | | | | | |(creator) | | | +----------------------------+-----------------+--------------------------------------+ |--creator | builtin | | | | | | | | | | | | | : | | | venv | cpython3-mac-brew | | | | cpython3-mac-framework | | | | cpython3-posix | | | | cpython3-win | | | | graalpy-posix | | | | graalpy-win pypy3-posix | | | | pypy3-win | | | | rustpython-posix | | | | rustpython-win venv | +----------------------------+-----------------+--------------------------------------+ |dest | | | | | | | | | | virtualenv | +----------------------------+-----------------+--------------------------------------+ |--clear | False | | | | | | | | | | | | | | | | | ( | | | | | | | | | | | | ) | +----------------------------+-----------------+--------------------------------------+ |--no-vcs-ignore | False | | | | | | | | | VCS | | | | | | | | | | | | | +----------------------------+-----------------+--------------------------------------+ |--system-site-packages | False | | | | | | | | | site-packages | | | | | | | | | +----------------------------+-----------------+--------------------------------------+ |--symlinks | True | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | +----------------------------+-----------------+--------------------------------------+ |--copies, --always-copy | False | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |box center; | | | |l|l|l. | | | |core => | | | | | | | | | | | | | | | |seeder | | | +----------------------------+-----------------+--------------------------------------+ |--seeder | 'app-data' | | | | | | | | | (seed) | | | | | | | | : app-data pip | +----------------------------+-----------------+--------------------------------------+ |--no-seed, --without-pip | False | | | | | | | | | (seed) | +----------------------------+-----------------+--------------------------------------+ |--no-download, | True | | |--never-download | | | | | | | | | | | | | | | | | | pip/setuptools/wheel PyPI | +----------------------------+-----------------+--------------------------------------+ |--download | False | | | | | | | | | | | | | | | | | | | | | pip/setuptools/wheel PyPI | +----------------------------+-----------------+--------------------------------------+ |--extra-search-dir | [] | | | | | wheel | | | | | | | | wheel | | | | ( | | | | | | | | ) | +----------------------------+-----------------+--------------------------------------+ |--pip | 'bundle' | pip | | | | | | | | (seed): embed bundle | | | | none | | | | | +----------------------------+-----------------+--------------------------------------+ |--setuptools | 'none' | setuptools | | | | | | | | (seed): embed bundle | | | | none | | | | | +----------------------------+-----------------+--------------------------------------+ |--no-pip | False | pip | +----------------------------+-----------------+--------------------------------------+ |--no-setuptools | False | setuptools | +----------------------------+-----------------+--------------------------------------+ |--no-periodic-update | False | | | | | | | | | ( | | | | ) | | | | wheel | +----------------------------+-----------------+--------------------------------------+ +-------------------------------+--------------------------------------+--------------------------------------+ |app-data => | | | | | | | | seeder | | | | | | | |app-data | | | +-------------------------------+--------------------------------------+--------------------------------------+ |--symlink-app-data | False | | | | | (symlink) | | | | | | | | | | | | | | | | app-data | | | | ( seed | | | | pip>=19.3) | |box center; | | | |l|l|l. | | | |core => | | | | | | | | | | | | | | | | | | | +-------------------------------+--------------------------------------+--------------------------------------+ |--activators | | | | | | - | | | | | | | | | | | | | | | | | | | | : xonsh | | | | bash batch cshell fish | | | | nushell powershell python | +-------------------------------+--------------------------------------+--------------------------------------+ |--prompt | | | | | | (prompt) | | | | | | | | | | | | | | | | ( . | | | | | | | | | | | | ) | +-------------------------------+--------------------------------------+--------------------------------------+ (Environment layout) (hard-code) . (builtin creators) CPython PyPy GraalPy RustPython . {minor} (minor version) python3.{minor} CPython 3.14 python3.14 . POSIX bin (link) : +-----------------------+---------------------------+ | | | +-----------------------+---------------------------+ |python | | | | | | | | | | . | +-----------------------+---------------------------+ |python3 | | | | | | | (Alias). | +-----------------------+---------------------------+ |python3.{minor} | | | | | | | | | | | | | | | | . | +-----------------------+---------------------------+ |python3.{minor}t | | | | | | | | | | | | | (Free-threaded). | +-----------------------+---------------------------+ | | | | | | | | | | | | | | | | | | | | | | | | | | pypy3.{minor}. | +-----------------------+---------------------------+ Windows Scripts (symlink) (bpo-42013 ): +-----------------------+---------------------------+ | | | +-----------------------+---------------------------+ |python.exe | | | | | | | | | | . | +-----------------------+---------------------------+ |python3.exe | | | | | | | (Alias). | +-----------------------+---------------------------+ |python3 | | | | | | | | | | . | +-----------------------+---------------------------+ |python3.{minor}t.exe | | | | | | | | | | | | | (Free-threaded). | +-----------------------+---------------------------+ |pythonw.exe | | | | | | | | | | | | | | | | . | +-----------------------+---------------------------+ |pythonw3.exe | | | | | | | pythonw.exe. | +-----------------------+---------------------------+ |pythonw3.{minor}t.exe | | | | | | | | | | | | | (Free-threaded). | +-----------------------+---------------------------+ | | | | | | | | | | | | | | | | | | | | | | | | | | python_d.exe. | +-----------------------+---------------------------+ CPython 3.13 python.exe (redirector) venvlauncher.exe pythonw.exe venvwlauncher.exe . pyvenv.cfg (base prefix) DLL . Scripts venv . : --copies POSIX () . . virtualenv . virtualenv.cli_run Session . Use virtualenv <> . virtualenv (virtualenv module) virtualenv.cli_run(args, options=None, setup_logging=True, env=None) . (Parameters) o args (list [str ]) -- o options (VirtualEnvOptions | None ) -- VirtualEnvOptions o setup_logging (bool ) -- True (logging handlers) False o env (MutableMapping [str , str ] | None ) -- (Return type) Session (Returns) ( ) virtualenv.session_via_cli(args, options=None, setup_logging=True, env=None) virtualenv ( cli_run ). . (Parameters) o args (list [str ]) -- o options (VirtualEnvOptions | None ) -- VirtualEnvOptions o setup_logging (bool ) -- True (logging handlers) False o env (MutableMapping [str , str ] | None ) -- (Return type) Session (Returns) ( ) Session (Session class) Session virtualenv . class virtualenv.run.session.Session(verbosity, app_data, interpreter, creator, seeder, activators) . (Parameters) o verbosity (int ) o app_data (AppData <#virtualenv.app_data.base.AppData>) o interpreter (PythonInfo <#virtualenv.discovery.py_info .PythonInfo>) o creator (Creator <#virtualenv.create.creator.Creator>) o seeder (Seeder <#virtualenv.seed.seeder.Seeder>) o activators (list [Activator <#virtualenv.activation .activator.Activator>]) property verbosity: int (verbosity) . property interpreter: PythonInfo <#virtualenv.discovery.py_info .PythonInfo> . property creator: Creator <#virtualenv.create.creator.Creator> (creator) ( ). property seeder: Seeder <#virtualenv.seed.seeder.Seeder> (pip setuptools wheel). property activators: list [Activator <#virtualenv.activation.activator .Activator>] . CLI . class virtualenv.config.cli.parser.VirtualEnvOptions(**kwargs) kwargs (Any ) set_src(key, value, src) . o key (str ) -- o value (Any ) -- o src (str ) -- ( "cli" "env var" "default") None get_source(key) . key (str ) -- str | None ( "cli" "env var" "default") None property verbosity: int | None verbose - quiet . None --verbose --quiet virtualenv . . virtualenv venv uv Python 3.3 venv PEP 405 . uv Rust uv venv . virtualenv : venv . +-------------------------------------+-----------------------------------------------+----------------------------------------------+---------------------------------+ | | venv | virtualenv | uv | +-------------------------------------+-----------------------------------------------+----------------------------------------------+---------------------------------+ | | (+ | | | | | ) pip | | | | | | | Rust | | | seed | | . | | | . | . | | | | | | | | | | | pip/setuptools seed | | | | | . | +-------------------------------------+-----------------------------------------------+----------------------------------------------+---------------------------------+ | | | | | | | . | (discovery) | . | | | | seeding | | | | | . | | +-------------------------------------+-----------------------------------------------+----------------------------------------------+---------------------------------+ | | | | | | | | | | | | . | | | | | | ( | uv. | | | | | | | | | uv PATH). | | +-------------------------------------+-----------------------------------------------+----------------------------------------------+---------------------------------+ | | | PyPI | | | | . | . | | | | | | | | | | | . | +-------------------------------------+-----------------------------------------------+----------------------------------------------+---------------------------------+ | | | | | | | create(). | | . | |(API) | | | | | | | | | | | | | | | | | | | | | | . | | | | | tox poetry pipx | | | | | . | | +-------------------------------------+-----------------------------------------------+----------------------------------------------+---------------------------------+ | | py.typed | | | | | | | ( Rust). | | | . | py.typed | | | | | PEP 561 | | | | | ty | | | | | . | | +-------------------------------------+-----------------------------------------------+----------------------------------------------+---------------------------------+ | | | | | | | . | | | | | | | | | | | (API) | | | | | (tox uv | | | | .readthedocs.io> virtualenvwrapper | | | | | ). | . | +-------------------------------------+-----------------------------------------------+----------------------------------------------+---------------------------------+ [graph].SS virtualenv host ( virtualenv ) target ( ) . --python (host) (target) ..SS virtualenv CPython PyPy 3.9 . requires-python >= 3.9 . . virtualenv Python creator () . +-------------------------------+-----------------------------+-----------------------------------+ | | | | +-------------------------------+-----------------------------+-----------------------------------+ |CPython | Linux, macOS, Windows | 3.9+. | | | | | | | | Free-threaded 3.13+ | | | | | | | | . | | | | | | | | | | | | | | | | Windows | | | | Microsoft Store Homebrew | | | | macOS framework. | +-------------------------------+-----------------------------+-----------------------------------+ |PyPy | Linux, macOS, Windows | 3.9+. | +-------------------------------+-----------------------------+-----------------------------------+ |GraalPy | Linux, macOS, Windows | 24.1+. | | | | | | | | | | | | | | | | | | | | (experimental) | | | | | | | | . | +-------------------------------+-----------------------------+-----------------------------------+ |RustPython | Linux, macOS, Windows | | | | | | | | | | | | | | | | | (experimental) | | | | | | | | . | +-------------------------------+-----------------------------+-----------------------------------+ (pip setuptools) CPython 3.9 3.16 (bundled) . . wheel seeder --no-seed seeder wheel . virtualenv Python : . A requests==2.25.1 B requests==2.28.0 site-packages . . virtualenv Python . Python . virtualenv : [graph].INDENT 0.0 : Python virtualenv Python . Python virtualenv . --python . : virtualenv : 1. Python 2. (pip setuptools wheel) 3. 4. VCS ( .gitignore --no-vcs-ignore) : (self-contained) . Python . Python . Python . : o . o Python Python . Python . : Python ( Python ) . Python . virtualenv Python . Python (CPython PyPy ) (32-bit 64-bit) . --python : (Path specifier) Python /usr/bin/python3.14 ./python. (Version specifier) {implementation}{version}{architecture}{machine} : o Implementation () (python python ). o Version () t free-threading . o Architecture () -64 -32 ( ). o Machine () -arm64 -x86_64 -aarch64 ( ). (amd64 <-> x86_64 aarch64 <-> arm64). : o python3.14.1 - Python 3.14.1 o 3 - Python 3 o 3.13t - Python 3.13 free-threading o cpython3 - CPython 3 o pypy2 - PyPy 2 o cpython3.12-64-arm64 - CPython 3.12 64-bit ARM64 o 3.11-64-x86_64 - 3.11 64-bit x86_64 o rustpython - RustPython PEP 440 PEP 440: o >=3.12 - Python 3.12 o ~=3.11.0 - Python 3.11.0 o cpython>=3.10 - CPython 3.10 virtualenv : [] 1. Windows Registry ( Windows): Python PEP 514 . 2. uv: UV_PYTHON_INSTALL_DIR uv Python Python. 3. PATH: PATH . shim (Version manager shim resolution) pyenv mise asdf (shim) PATH Python . virtualenv Python shim Python ( Python ) shim . virtualenv shim ($PYENV_ROOT/shims $MISE_DATA_DIR/shims $ASDF_DATA_DIR/shims) shim . shim virtualenv versions : 1. PYENV_VERSION ( ). 2. .python-version . 3. $PYENV_ROOT/version. pyenv mise asdf . : Python . Python ( Python ) . . Python virtualenv Python () . . virtualenv : venv (venv creator) PEP 405 venv . venv venv virtualenv Python . Windows . (builtin creator) virtualenv . builtin Python ( CPython PyPy GraalPy RustPython) (Windows POSIX) . builtin . venv . [graph] virtualenv venv . (Environment layout) <> . - (shebang) python CI - . pypy3.11 python_d.exe . Windows () (bpo-42013 ). CPython 3.13 venvlauncher.exe . pyvenv.cfg DLL zip . . (Seeders) virtualenv . : o pip - Python ( ). o setuptools - ( Python 3.12+ ). virtualenv : pip (pip seeder) pip wheel pip . wheel . . app-data (app-data seeder) . app-data . site-packages . : [graph] ( Linux macOS) app-data . VIRTUALENV_OVERRIDE_APP_DATA . Wheel (Wheel acquisition) wheel . virtualenv wheel : [graph] wheel (Embedded wheels) virtualenv wheel . virtualenv . Python virtualenv wheel Python . wheel (Upgraded embedded wheels) virtualenv --upgrade-embed-wheels wheel . PyPI . virtualenv wheel . virtualenv ( ). (Extra search directories) --extra-search-dir wheel . (air-gapped) . PyPI (PyPI download) wheel --download virtualenv pip PyPI . (seed packages) virtualenv --upgrade-embed-wheels virtualenv : [graph] . . --no-periodic-update . virtualenv . virtualenv . virtualenv.seed.wheels.embed get_embed_wheel wheel . virtualenv BUNDLE_FOLDER BUNDLE_SUPPORT MIN MAX OLDEST_SUPPORTED . OLDEST_SUPPORTED ( MIN) seeder wheel Python . virtualenv.seed.embed.base_embed.PERIODIC_UPDATE_ON_BY_DEFAULT False virtualenv . --upgrade-embed-wheels . . - . : [graph].INDENT 0.0 PATH bin (Scripts ) PATH . python pip . : o VIRTUAL_ENV - . o VIRTUAL_ENV_PROMPT - ( --prompt). o PKG_CONFIG_PATH - lib/pkgconfig . (venv) . . --prompt VIRTUAL_ENV_DISABLE_PROMPT . deactivate PATH . virtualenv : o Bash (activate) o Fish (activate.fish) o Csh/Tcsh (activate.csh) o PowerShell (activate.ps1) o Windows Batch (activate.bat) o Nushell (activate.nu) o Python (activate_this.py) -- Python <#programmatic- activation> : PowerShell Restricted activate.ps1 . : Set-ExecutionPolicy RemoteSigned virtualenv activate.ps1 PowerShell RemoteSigned . : . : # With activation source venv/bin/activate python script.py deactivate # Without activation venv/bin/python script.py Allison Kaptur There's no magic: virtualenv edition virtualenv PATH PYTHONHOME ..SS " (SEE ALSO)" o virtualenv <> - virtualenv. o <> - CLI. (Plugins) virtualenv entry point . virtualenv (seed) . (Extension points) virtualenv entry point : virtualenv.discovery . . virtualenv.create . (symlink) . virtualenv.seed (seed). ( pip setuptools wheel) . virtualenv.activate . . : virtualenv (entry points) (CLI) . (Your first plugin) pyenv . (Create the package structure) : virtualenv-pyenv/ pyproject.toml src/ virtualenv_pyenv/ __init__.py (Configure the entry point) pyproject.toml entry point virtualenv.discovery : [project] name = "virtualenv-pyenv" version = "0.1.0" dependencies = ["virtualenv>=20"] [project.entry-points."virtualenv.discovery"] pyenv = "virtualenv_pyenv:PyEnvDiscovery" [build-system] requires = ["setuptools>=61"] build-backend = "setuptools.build_meta" (Implement the plugin) src/virtualenv_pyenv/__init__.py Discover : from __future__ import annotations import subprocess from argparse import ArgumentParser from pathlib import Path from virtualenv.config.cli.parser import VirtualEnvOptions from virtualenv.discovery.discover import Discover from virtualenv.discovery.py_info import PythonInfo class PyEnvDiscovery(Discover): def __init__(self, options: VirtualEnvOptions) -> None: super().__init__(options) self.python_spec = options.python if options.python else "python" @classmethod def add_parser_arguments(cls, parser: ArgumentParser) -> None: parser.add_argument( "--python", dest="python", metavar="py", type=str, default=None, help="pyenv Python version to use (e.g., 3.11.0)", ) def run(self) -> PythonInfo | None: try: result = subprocess.run( ["pyenv", "which", "python"], capture_output=True, text=True, check=True, ) python_path = Path(result.stdout.strip()) return PythonInfo.from_exe(str(python_path)) except (subprocess.CalledProcessError, FileNotFoundError) as e: raise RuntimeError(f"Failed to locate pyenv Python: {e}") from e virtualenv : $ pip install -e virtualenv-pyenv/ virtualenv : $ virtualenv --discovery help pyenv . : $ virtualenv --discovery=pyenv myenv created virtual environment CPython3.11.0.final.0-64 in 234ms creator CPython3Posix(dest=/path/to/myenv, clear=False, no_vcs_ignore=False, global=False) seeder FromAppData(download=False, pip=bundle, setuptools=bundle, wheel=bundle, via=copy, app_data_dir=/path) added seed packages: pip==23.0, setuptools==65.5.0, wheel==0.38.4 activators BashActivator,CShellActivator,FishActivator,NushellActivator,PowerShellActivator,PythonActivator virtualenv . (discovery) Python . virtualenv.discovery . Discover : from __future__ import annotations from argparse import ArgumentParser from virtualenv.config.cli.parser import VirtualEnvOptions from virtualenv.discovery.discover import Discover from virtualenv.discovery.py_info import PythonInfo class CustomDiscovery(Discover): @classmethod def add_parser_arguments(cls, parser: ArgumentParser) -> None: parser.add_argument("--custom-opt", help="custom discovery option") def __init__(self, options: VirtualEnvOptions) -> None: super().__init__(options) self.custom_opt = options.custom_opt def run(self) -> PythonInfo | None: # Locate Python interpreter and return PythonInfo return PythonInfo.from_exe(str(self._find_python())) def _find_python(self) -> str: # Implementation-specific logic ... : [virtualenv.discovery] custom = your_package.discovery:CustomDiscovery creator . virtualenv.create . Creator : from __future__ import annotations from argparse import ArgumentParser from virtualenv.app_data.base import AppData from virtualenv.config.cli.parser import VirtualEnvOptions from virtualenv.create.creator import Creator, CreatorMeta from virtualenv.discovery.py_info import PythonInfo class CustomCreator(Creator): @classmethod def add_parser_arguments( cls, parser: ArgumentParser, interpreter: PythonInfo, meta: CreatorMeta, app_data: AppData, ) -> None: parser.add_argument("--custom-creator-opt", help="custom creator option") def __init__(self, options: VirtualEnvOptions, interpreter: PythonInfo) -> None: super().__init__(options, interpreter) self.custom_opt = options.custom_creator_opt def create(self) -> None: # Create directory structure self.bin_dir.mkdir(parents=True, exist_ok=True) # Copy or symlink Python executable self.install_python() # Set up site-packages self.install_site_packages() # Write pyvenv.cfg self.set_pyenv_cfg() (entry point) : [virtualenv.create] cpython3-posix = virtualenv.create.via_global_ref.builtin.cpython.cpython3:CPython3Posix cpython3-win = virtualenv.create.via_global_ref.builtin.cpython.cpython3:CPython3Windows seeder seeder . virtualenv.seed . cannot_seed seeder . None seeder . seeder wheel . Seeder : from __future__ import annotations from argparse import ArgumentParser from virtualenv.app_data.base import AppData from virtualenv.config.cli.parser import VirtualEnvOptions from virtualenv.create.creator import Creator from virtualenv.discovery.py_info import PythonInfo from virtualenv.seed.seeder import Seeder class CustomSeeder(Seeder): @classmethod def add_parser_arguments( cls, parser: ArgumentParser, interpreter: PythonInfo, app_data: AppData ) -> None: parser.add_argument("--custom-seed-opt", help="custom seeder option") @classmethod def cannot_seed(cls, interpreter: PythonInfo) -> str | None: # ship wheels down to Python 3.6, for example if interpreter.version_info[:2] >= (3, 6): return None return "custom seeder ships wheels only for Python 3.6 and later" def __init__(self, options: VirtualEnvOptions, enabled: bool) -> None: super().__init__(options, enabled) self.custom_opt = options.custom_seed_opt def run(self, creator: Creator) -> None: # Install packages into creator.bin_dir / creator.script("pip") self._install_packages(creator) def _install_packages(self, creator: Creator) -> None: # Implementation-specific logic ... : [virtualenv.seed] custom = your_package.seed:CustomSeeder . virtualenv.activate . Activator : from __future__ import annotations from pathlib import Path from virtualenv.activation.activator import Activator from virtualenv.create.creator import Creator class CustomShellActivator(Activator): def generate(self, creator: Creator) -> list[Path]: # Generate activation script content script_content = self._render_template(creator) # Write to activation directory dest = creator.bin_dir / self.script_name dest.write_text(script_content) return [dest] def _render_template(self, creator: Creator) -> str: # Return activation script content return f""" # Custom shell activation script export VIRTUAL_ENV="{creator.dest}" export PATH="{creator.bin_dir}:$PATH" """ @property def script_name(self) -> str: return "activate.custom" : [virtualenv.activate] bash = virtualenv.activation.bash:BashActivator fish = virtualenv.activation.fish:FishActivator custom = your_package.activation:CustomShellActivator pyproject.toml : [project] name = "virtualenv-custom-plugin" version = "1.0.0" dependencies = ["virtualenv>=20.0.0"] [project.entry-points."virtualenv.discovery"] custom = "virtualenv_custom.discovery:CustomDiscovery" [project.entry-points."virtualenv.create"] custom-posix = "virtualenv_custom.creator:CustomCreator" [project.entry-points."virtualenv.seed"] custom = "virtualenv_custom.seeder:CustomSeeder" [project.entry-points."virtualenv.activate"] custom = "virtualenv_custom.activator:CustomActivator" [build-system] requires = ["setuptools>=61"] build-backend = "setuptools.build_meta" virtualenv : $ pip install virtualenv-custom-plugin : $ pip install -e /path/to/virtualenv-custom-plugin : $ virtualenv --discovery=custom --creator=custom-posix --seeder=custom --activators=custom test-env . (Discovery) Python . class virtualenv.discovery.discover.Discover(options) options (VirtualEnvOptions <#virtualenv.config.cli.parser .VirtualEnvOptions>) classmethod add_parser_arguments(parser) parser (ArgumentParser ) None abstractmethod run() PythonInfo | None property interpreter: PythonInfo <#virtualenv.discovery.py_info .PythonInfo> | None run() (cached). PythonInfo PythonInfo . class virtualenv.discovery.py_info.PythonInfo Python . platform: str implementation: str pypy_version_info: tuple [int , ...] version_info: VersionInfo architecture: int sysconfig_platform: str | None version_nodot: str | None version: str os: str free_threaded: bool debug_build: bool prefix: str | None base_prefix: str | None real_prefix: str | None base_exec_prefix: str | None exec_prefix: str | None executable: str original_executable: str system_executable: str | None has_venv: bool path: list [str ] file_system_encoding: str stdout_encoding: str | None sysconfig_scheme: str | None sysconfig_paths: dict [str , str ] distutils_install: dict [str , str ] sysconfig: dict [str , str | None ] sysconfig_vars: dict [str , str | int | None ] tcl_lib: str | None tk_lib: str | None system_stdlib: str system_stdlib_platform: str max_size: int install_path(key) key . key (str ) -- sysconfig ( "scripts" "purelib"). str property version_str: str major.minor.micro ( 3.13.2). property version_release_str: str major.minor ( 3.13). property python_name: str pythonX.Y ( python3.13). property is_old_virtualenv: bool True virtualenv ( real_prefix ). property is_venv: bool True venv PEP 405 ( base_prefix ). sysconfig_path(key, config_var=None, sep='/') sysconfig key . o key (str ) -- sysconfig ( "purelib" "include"). o config_var (dict [str , str | int | None ] | None ) -- sysconfig None . o sep (str ) -- . str property system_include: str include C. property system_prefix: str . property system_exec_prefix: str . property system_exe: str . system_executable resolve_to_system() None . . property machine: str (ISA) sysconfig.get_platform() . property spec: str ( CPython3.13.2-64-arm64). classmethod clear_cache(cache) cache. cache (PyInfoCache) -- . None satisfies(spec, *, impl_must_match) . o spec (PythonSpec) -- . o impl_must_match (bool ) -- True . bool classmethod current(cache=None) . cache (PyInfoCache | None ) -- None . PythonInfo classmethod current_system(cache=None) virtualenv. cache (PyInfoCache | None ) -- None . PythonInfo to_json() JSON. str to_dict() (dictionary) . dict [str , str | int | bool | None | tuple [int | str , ... ] | list [str ] | dict [str , str | int | None ]] classmethod from_exe(exe, cache=None, *, raise_on_error=True, ignore_cache=False, resolve_to_host=True, env=None) . o exe (str ) -- . o cache (PyInfoCache | None ) -- None ..IP o 2 raise_on_error (bool ) -- None . o ignore_cache (bool ) -- . o resolve_to_host (bool ) -- virtualenv . o env (Mapping [str , str ] | None ) -- os.environ . (Return type) PythonInfo | None classmethod from_json(payload) JSON. (Parameters) payload (str ) -- JSON to_json(). (Return type) PythonInfo classmethod from_dict(data) PythonInfo . (Parameters) data (dict [str , str | int | bool | None | tuple [int | str , ... ] | list [str ] | dict [str , str | int | None ]]) -- to_dict(). (Return type) PythonInfo classmethod resolve_to_system(cache, target) virtualenv/venv . (Parameters) o cache (PyInfoCache | None ) -- None . o target (PythonInfo) -- . (Return type) PythonInfo discover_exe(cache, prefix, *, exact=True, env=None) prefix . (Parameters) o cache (PyInfoCache) -- . o prefix (str ) -- . o exact (bool ) -- True . o env (Mapping [str , str ] | None ) -- os.environ . (Return type) PythonInfo . class virtualenv.app_data.base.AppData virtualenv. abstractmethod close() virtualenv . None abstractmethod reset() (reset app data) . None abstractmethod py_info(path) . path (Path ) -- ContentStore abstractmethod py_info_clear() . None property can_update: bool True . abstractmethod embed_update_log(distribution, for_py_version) (embed update log) . o distribution (str ) -- ( pip) o for_py_version (str ) -- Python ContentStore property house: Path . property transient: bool (transient) True . abstractmethod wheel_image(for_py_version, name) wheel . o for_py_version (str ) -- Python o name (str ) -- Path wheel ensure_extracted(path, to_folder=None) zipapp . o path (Path ) -- o to_folder (Path | None ) -- Generator [Path ] (yield) abstractmethod extract(path, to_folder) zipapp . o path (Path ) -- o to_folder (Path | None ) -- Generator [Path ] (yield) abstractmethod locked(path) . path (Path ) -- Generator [None ] Creator Python . class virtualenv.create.creator.CreatorMeta class virtualenv.create.creator.Creator(options, interpreter) Python . o options (VirtualEnvOptions <#virtualenv.config.cli .parser.VirtualEnvOptions>) o interpreter (PythonInfo) . o options (VirtualEnvOptions <#virtualenv.config.cli .parser.VirtualEnvOptions>) -- CLI add_parser_arguments() o interpreter (PythonInfo) -- classmethod can_create(interpreter) . interpreter (PythonInfo) -- CreatorMeta | bool | None None add_parser_arguments() classmethod add_parser_arguments(parser, interpreter, meta, app_data) CLI . o parser (ArgumentParser ) -- CLI o app_data (AppData) -- o interpreter (PythonInfo) -- o meta (CreatorMeta) -- can_create() None abstractmethod create() . None add_cachedir_tag() . None setup_ignore_vcs() (ignore) . None ( pip setuptools wheel) . class virtualenv.seed.seeder.Seeder(options, enabled) (seed) . o options (VirtualEnvOptions <#virtualenv.config.cli .parser.VirtualEnvOptions>) o enabled (bool ) . o options (VirtualEnvOptions <#virtualenv.config.cli .parser.VirtualEnvOptions>) -- add_parser_arguments() o enabled (bool ) -- classmethod cannot_seed(interpreter) . interpreter (PythonInfo) -- str | None None classmethod add_parser_arguments(parser, interpreter, app_data) CLI (seed). o parser (ArgumentParser ) -- CLI o app_data (AppData) -- CLI o interpreter (PythonInfo) -- None abstractmethod run(creator) (seed). creator (Creator) -- ( virtualenv.create.creator.Creator) None . class virtualenv.activation.activator.Activator(options) . options (VirtualEnvOptions <#virtualenv.config.cli.parser .VirtualEnvOptions>) . options (VirtualEnvOptions <#virtualenv.config.cli.parser .VirtualEnvOptions>) -- add_parser_arguments() classmethod supports(interpreter) . interpreter (PythonInfo) -- bool True False classmethod add_parser_arguments(parser, interpreter) CLI . o parser (ArgumentParser ) -- CLI o interpreter (PythonInfo) -- None abstractmethod generate(creator) . creator (Creator) -- ( virtualenv.create.creator.Creator) list [Path ] (Plugin architecture) virtualenv . (Entry points) virtualenv (setuptools / importlib.metadata) . : o virtualenv.discovery o virtualenv.create o virtualenv.seed o virtualenv.activate virtualenv CLI . pyproject.toml virtualenv . virtualenv virtualenv ..SS " (Plugin lifecycle)" : [] : 1. virtualenv entry point 2. (CLI parser) 3. discovery creator seeder activator 4. : discover -> create -> seed -> activate 5. (Extension point design) : (Discover Creator Seeder Activator) . virtualenv entry point pyproject.toml . CPython cpython3-posix . entry point . . (--discovery --creator --seeder --activators) . activator . add_parser_arguments . virtualenv --help . (How plugins interact) (pipeline) : Discovery -> Creator discovery PythonInfo Python . Python . creator PythonInfo . Creator -> Seeder creator Creator . bin site-packages Python . seeder . Seeder -> Activator (seeding) activator Creator . bin . . PythonInfo discovery creator Creator creator seeder activators . (Plugin isolation) . discovery creator activator . . (Development) (Getting started) virtualenv . . virtualenv . virtualenv . issue . (Setup) virtualenv Python . : o : GitHub . git : git clone https://github.com/pypa/virtualenv cd virtualenv o Python: CPython . . o tox : . pipx . tox virtualenv .tox/dev . tox -e dev .tox/dev/bin/virtualenv # on Linux .tox/dev/Scripts/virtualenv # on Windows (Running tests) virtualenv pytest . tox virtualenv . : tox -e py Python tox . pyNN python : py314 pypy3 . tox pytest . pytest . pytest : # Using markers tox -e py -- -m "not slow" # Using keywords tox -e py -- -k "test_extra" (bash fish powershell ). (skip ) CI CI . (Running linters) virtualenv pre-commit . pre-commit virtualenv . : tox -e fix : # noqa - . # noqa . (Type checking) virtualenv py.typed PEP 561 . virtualenv (inline-typed) . . : tox -e type ty ( Rust Astral) Python 3.14 . : tox -e type-3.9 ..SS (Annotation guidelines) o from __future__ import annotations ( required-imports ruff ). o (type checking) if TYPE_CHECKING: . o ANN ruff . ANN401 (typing.Any) # noqa: ANN401 Any ( serialization dynamic dispatch) . o (concrete types) Any . Union / | (nullable) . o ( ) # ty: ignore[rule-name] . (Building documentation) virtualenv Sphinx . reStructuredText . : tox -e docs .tox/docs_out index.html . (Logo and branding) docs/_static : o virtualenv.png -- (wordmark). (light_logo/dark_logo docs/conf.py) virtualenv . o virtualenv.svg favicon (html_favicon) PNG x . (vector) PNG . (Release) virtualenv pip setuptools . virtualenv ( ). (Performing a release) PyPI GitHub Release zipapp get-virtualenv https://bootstrap.pypa.io/virtualenv.pyz . (Version bumping) --version tox r -e release . auto docs/changelog : *.feature.rst *.removal.rst minor patch . major minor patch . : (tag) main. (push) sdist wheel zipapp trusted publisher PyPI GitHub Release zipapp get-virtualenv . (rollback job) . GitHub Actions () 1. Pre-release workflow GitHub . 2. Run workflow (auto major minor patch). tox r -e release --version auto ( --version minor). (Contributing).SS Pull Request (Submitting pull requests) (Pull Request) main . virtualenv MIT License . . virtualenv Python <#compatibility-requirements>. pull request . Pull Request . . (patch) . PR . pull request << >> ("feature branches") . . <<>> ("cosmetic") PR . (whitespace) . PR << >> ("formatting cleanup") . (Automated testing) pull request 'main' GitHub Actions ( .github/workflows/check.yaml ) . CI PR GitHub pull request . CI CI "Details" . CI pull request pull request pull request . job/build . (NEWS entries) changelog.rst towncrier (non-trivial) (news entry) . issue . Pull Request issue ( PR ). issue pull request docs/changelog : o feature.rst, o bugfix.rst, o doc.rst, o removal.rst, o misc.rst. issue PR 1234 docs/changelog/1234.bugfix.rst . PR ( / docs/changelog/1234.bugfix.rst docs/changelog/1234.remove.rst ). PR issue/PR towncrier . (Contents of a NEWS entry) reStructuredText . issue PR towncrier issue . changelog.rst (sentence case) -- This change will . / . . (Choosing the type of NEWS entry) (trivial) . : (refactoring) . PR .trivial news/ . (Becoming a maintainer) . (triage) virtualenv . virtualenv triage . virtualenv . . : virtualenv . : o GitHub Push Access o PyPI Publishing Access o CI Administration capabilities o ReadTheDocs Administration capabilities o Bernat Gabor o Rahul Devikar (Previous maintainers) o Paul Moore o Ian Bicking o Donald Stufft (Release History) v[UNRELEASED DRAFT] (2026-09-01) . v21.7.8 (2026-09-01) - 21.7.8 (Bugfixes - 21.7.8) o meta.error . RefWhen RefMust FileNotFoundError (dangling symlink) - @darrenhuai . (#3227 ) v21.7.7 (2026-08-28) - 21.7.7 (Bugfixes - 21.7.7) o python-discovery >=1.6 PythonInfo.system_exe system_executable - @gaborbernat . (#3224 ) - 21.7.7 (Improved Documentation - 21.7.7) o . (Environment layout) <> (redirector) - @gaborbernat . (#3225 ) v21.7.6 (2026-08-28) - 21.7.6 (Bugfixes - 21.7.6) o virtualenv (shim) venvlauncher.exe CPython 3.13+ Scripts python_d.exe . - @darrenhuai . (#3223 ) v21.7.5 (2026-08-25) - 21.7.5 (Bugfixes - 21.7.5) o (type check) python-discovery 1.5.2 None prefix sysconfig_vars : libpython INSTSONAME/LIBDIR . (#3211 ) o ExePathRef.can_run None False - @darrenhuai . (#3217 ) o safe_delete ignore_errors=True shutil.rmtree chmod-and-retry (no-op) . - wheel set_tree - --reset-app-data --clear . - @darrenhuai . (#3222 ) v21.7.4 (2026-08-10) - 21.7.4 (Bugfixes - 21.7.4) o wheel : o setuptools 84.0.0 83.0.0 (#3208 ) v21.7.3 (2026-08-08) - 21.7.3 (Bugfixes - 21.7.3) o ListType.split_values list TypeError bytes - @darrenhuai . (#3207 ) - 21.7.2 o wheel : o pip 26.2.1 26.2 (#3206 ) v21.7.1 (2026-07-30) - 21.7.1 o wheel : o pip 26.2 26.1.2 (#u ) - 21.7.1 o virtualenv.png virtualenv.svg favicon - @gaborbernat . (#3199 ) v21.7.0 (2026-07-21) - 21.7.0 o Python 3.15: CI CPython 3.15 free-threaded 3.15t Programming Language :: Python :: 3.15 . (#3192 ) v21.6.1 (2026-07-10) - 21.6.1 o (prompt) fish (builtins) (shadow) . functions printf string echo source/. builtin ( . ) (exit status) CPython gh-140006 . (#3185 ) v21.6.0 (2026-07-06) - 21.6.0 o distutils _virtualenv.{py,pth} Python 3.10 pip setuptools CPython . Python 3.9 - #3181 . (#3181 ) v21.5.2 (2026-07-06) - 21.5.2 o wheel : o setuptools 83.0.0 (#3180 ) v21.5.1 (2026-06-16) - 21.5.1 o wheel ( 3.9). virtualenv pip seeder . --no-seed seeder wheel - @gaborbernat . (#3171 ) v21.5.0 (2026-06-13) - 21.5.0 o Python 3.8 virtualenv Python 3.9 . seed wheel virtualenv Python 3.8 . --wheel --no-wheel (no-ops) virtualenv 2026-12 - @gaborbernat . (#3170 ) - 21.5.0 o wheel : wheel 0.47.0 (#u ) - 21.4.3 o wheel : o pip 26.1.2 26.1.1 (#u ) o (symlink) home base-executable pyvenv.cfg getpath.realpath CPython (python/cpython#115237) stdlib ( python-build-standalone) - @gaborbernat . (#3157 ) o export PS1 bash . (#3158 ) o CYGWIN/MSYS/MINGW fish - user::LuNoX. (#3160 ) v21.4.2 (2026-05-31) - 21.4.2 o deactivate bash/zsh set -e hash -r ( hashing ) || true venv CPython (gh-149701) -deactivate - @gaborbernat . (#3152 ) v21.4.1 (2026-05-28) - 21.4.1 o venvlauncher_d.exe executables() AttributeError debug_build - @gaborbernat . (#3151 ) v21.4.0 (2026-05-28) - 21.4.0 o (PyPy 3.6 importlib) _virtualenv.py - @gaborbernat . (#3149 ) o (python_d.exe venvlauncher_d.exe) venv CPython __SCRIPT_DIR__ has_shim Python 3.7 pyvenv_launch_patch_active wheel >= 3.9 - @gaborbernat . (#3150 ) v21.3.3 (2026-05-13) - 21.3.3 o GraalPy GraalPy - @timfel . (#3144 ) v21.3.2 (2026-05-12) . v21.3.1 (2026-05-05) - 21.3.1 o wheel : o pip 26.1.1 26.1 (#3138 ) v21.3.0 (2026-04-27) - 21.3.0 o xonsh (activate.xsh) 20.7.0 virtualenv . (#3003 ) - 21.3.0 o wheel : o pip 26.1 (#3132 ) (Bugfixes) - 21.2.4 o : seed wheel wheel .. app-data . (#3118 ) o : SHA-256 seed wheel pip . (hash table) BUNDLE_SUPPORT tasks/upgrade_wheels.py . (#3119 ) o : pip download seed wheel extras pip (shell metacharacters) subprocess . (#3120 ) o : virtualenv.util.zipapp Path.relative_to zipapp . (#3121 ) o : (context) HTTPS PyPI TLS . virtualenv wheel "" . VIRTUALENV_PERIODIC_UPDATE_INSECURE=1 (trust stores) . (#3122 ) v21.2.3 (2026-04-14) . v21.2.2 (2026-04-13) (Bugfixes) - 21.2.2 o python-discovery >=1.2.2 normalize_isa - @rahuldevikar . (#3117 ) v21.2.1 (2026-04-09) (Bugfixes) - 21.2.1 o wheel : o setuptools 82.0.1 82.0.0 (#3093 ) o . (#3110 ) v21.2.0 (2026-03-09) (Features) - 21.2.0 o wheel (tasks/upgrade_wheels.py) (type annotations) - @rahuldevikar . (#3075 ) (Bugfixes) - 21.2.0 o --without-scm-ignore-files subprocess venv Python 3.13+ .gitignore virtualenv test_create_no_seed --no-vcs-ignore subprocess - @gaborbernat . (#3089 ) o BASH_SOURCE[0] $0 bash PATH source - @gaborbernat . (#3090 ) v21.1.0 (2026-02-27) (Features) - 21.1.0 o PEP 561 py.typed virtualenv (inline-typed) - @rahuldevikar . (#3075 ) v21.0.0 (2026-02-25) (Deprecations and Removals) - 21.0.0 o (Python discovery) python-discovery PyPI ( ) . discovery ( from virtualenv.discovery.py_info import PythonInfo) from python_discovery import PythonInfo . virtualenv.discovery.py_info virtualenv.discovery.py_spec virtualenv.discovery.cached_py_info - @gaborbernat . (#3070 ) - 20.39.1 o RustPython - @elmjag . (#3010 ) v20.39.0 (2026-02-23) - 20.39.0 o shim (pyenv mise asdf) Python shim PATH - @gaborbernat . (#3049 ) o (ISA) Python -- CPU --python ( cpython3.12-64-arm64) . sysconfig.get_platform() (amd64 <-> x86_64 aarch64 <-> arm64) . - @rahuldevikar . (#3059 ) v20.38.0 (2026-02-19) - 20.38.0 o ( pip/setuptools/wheel) (platformdirs.user_cache_dir) (platformdirs.user_data_dir). . ( ~/.cache ~/Library/Caches macOS) - @rahuldevikar . (#1884 ) (#1884 ) o PKG_CONFIG_PATH (Bash Batch PowerShell Fish C Shell Nushell Python). lib/pkgconfig virtualenv PKG_CONFIG_PATH pkg-config / - @rahuldevikar . (#2637 ) o pip 26.0.1 25.3 setuptools 82.0.0 75.3.4 75.3.2 80.9.0 - @rahuldevikar . (#3027 ) o ty: ignore (type narrowing) assertion None - @rahuldevikar . (#3029 ) - 20.38.0 o DLL pywin32 (pywintypes*.dll pythoncom*.dll) Scripts virtualenv Windows. pywin32 DLL site-packages/pywin32_system32 - @rahuldevikar . (#2662 ) o (symlinks) pyvenv.cfg venv. os.path.abspath() os.path.realpath() Python ( ) - @rahuldevikar . #2770 . (#2770 ) o Windows python.exe () Python ( C:\Program Files) C:\Program - @rahuldevikar . (#2985 ) o bash -u (set -o nounset) bash ${PKG_CONFIG_PATH:-} ${PKG_CONFIG_PATH:+:${PKG_CONFIG_PATH}} PKG_CONFIG_PATH - @Fridayai700 . (#3044 ) o JSON Python JSONDecodeError KeyError - @gaborbernat . (#3054 ) v20.36.1 (2026-01-09) - 20.36.1 o TOCTOU app_data (symlink) - @tsigouris007 @gaborbernat . (#3013 ) v20.36.0 (2026-01-07) - 20.36.0 o PEP 440 --python. >= <= ~= Python . : virtualenv --python=">=3.12" myenv . (:issue:`2994) v20.35.4 (2025-10-28) - 20.35.4 o (race condition) _virtualenv.py NameError _DISTUTILS_PATCH - @gracetyy . (#2969 ) o wheel : o pip 25.3 25.2 (#2989 ) - 20.35.3 o RuntimeError test_too_many_open_files @esafak (#2935 ) v20.35.2 (2025-10-10) - 20.35.2 o discovery - @gaborbernat . (#2978 ) v20.35.1 (2025-10-09) - 20.35.1 o get_interpreter cache app_data - @esafak (#2972 ) o PythonInfo - @gaborbernat . (#2975 ) v20.35.0 (2025-10-08) - 20.35.0 o AppData Cache discovery (decoupling) - @esafak . (#2074 ) o python3.exe python3 Windows Python 3 - @esafak . (#2774 ) - 20.35.0 o tcl/tk getattr - @esafak (#2944 ) o (absolute import) fs_is_case_sensitive - @esafak . (#2955 ) v20.34.0 (2025-08-13) - 20.34.0 o discovery - @esafak . FileCache py_info ( discovery) - @esafak . py_info FileCache - @esafak . discovery creator - @esafak . discovery info utils - @esafak . (#2074 ) o PyPy 3.11. @esafak . (#2932 ) - 20.34.0 o wheel pip 25.2 25.1.1 - @gaborbernat . (#2333 ) o RuntimeError test_too_many_open_files @esafak (#2935 ) o Python PATH python uv. @edgarrmondragon . (#2952 ) v20.33.1 (2025-08-05) - 20.33.1 o ()_get_tcl_tk_libs PythonInfo. @esafak . (#2930 ) o py_info.py test_py_info_cache_invalidation_on_py_info_change @esafak . (#2933 ) v20.33.0 (2025-08-03) - 20.33.0 o Tcl Tkinter. ! @esafak . (#425 ) - 20.33.0 o (logging) --help (flaky test). @esafak . (#u ) o (cache invalidation) PythonInfo py_info.py. @esafak . (#2467 ) o (discovery plugin) StopIteration . StopIteration RuntimeError . @esafak . (#2493 ) o --python --try-first-with. @esafak . (#2659 ) o UTF-8 pip download @esafak . (#2780 ) o (symlink) --copies fs_supports_symlink . @esafak . (#2786 ) o Python . @esafak . (#2808 ) o 'Too many open files' (file descriptor leak) virtualenv. @esafak . (#2834 ) o venv Windows (venvlauncher.exe venvwlauncher.exe) Python 3.13 @esafak . (#2851 ) o Nushell --optional get Nushell 0.106.0 -i . @gaborbernat . (#2910 ) - 20.32.0 o Nushell - @esafak . (#nushell_activation ) o Python uv (#2901 ) - 20.32.0 o python - @esafak (#2870 ) o setuptools 80.9.0 80.3.1 - @gaborbernat . (#2900 ) v20.31.2 (2025-05-08) . v20.31.1 (2025-05-05) - 20.31.1 o wheel : o pip 25.1.1 25.1 o setuptools 80.3.1 78.1.0 (#2880 ) v20.31.0 (2025-05-05) - 20.31.0 o wheel wheel ( Python 3.8) setuptools bdist_wheel . pip 25.1. (#2868 ) - 20.31.0 o get_embed_wheel() distribution TypeError . (#2877 ) o HelpFormatter Python 3.14.0b1. (#2878 ) v20.30.0 (2025-03-31) - 20.30.0 o GraalPy . (#2832 ) - 20.30.0 o wheel : o setuptools 78.1.0 75.3.2 (#2863 ) v20.29.3 (2025-03-06) - 20.29.3 o PATH. (#2794 ) v20.29.2 (2025-02-10) - 20.29.2 o wheel virtualenv - @gaborbernat . (#2841 ) o wheel pip 25.0.1 24.3.1 - @gaborbernat . (#2843 ) v20.29.1 (2025-01-17) - 20.29.1 o PyInfo - @robsdedude . (#2827 ) - 20.29.0 o free-threaded python3.13t. (#2809 ) - 20.29.0 o wheel : o setuptools 75.6.0 75.8.0 (#2823 ) v20.28.1 (2025-01-02) - 20.28.1 o tcsh tcsh - @gaborbernat . (#2814 ) v20.28.0 (2024-11-25) - 20.28.0 o CACHEDIR.TAG - "user:neilramsay. (#2803 ) v20.27.2 (2024-11-25) - 20.27.2 o wheel : o setuptools 75.2.0 75.3.0 (#2798 ) o wheel : o wheel 0.44.0 0.45.0 o setuptools 75.5.0 (#2800 ) o echo off batch (#2801 ) o wheel : o setuptools 75.5.0 75.6.0 o wheel 0.45.0 0.45.1 (#2804 ) v20.27.1 (2024-10-28) - 20.27.1 o wheel : o pip 24.2 24.3.1 (#2789 ) v20.27.0 (2024-10-17) - 20.27.0 o 3.7 CI - @gaborbernat . (#2758 ) - 20.27.0 o $PATH - @hroncok . (#2782 ) o wheel : o setuptools 75.1.0 75.2.0 o pip 24.0 o setuptools 68.0.0 o wheel 0.42.0 o @gaborbernat . (#2783 ) o zipapp 0.3.9 distlib - @gaborbernat . (#2784 ) - 20.26.6 o - @y5c4l3 . (#2768 ) v20.26.5 (2024-09-17) - 20.26.5 o wheel : setuptools 75.1.0 74.1.2 - @gaborbernat . (#2765 ) v20.26.4 (2024-09-07) - 20.26.4 o () virtualenv .bat. (#2728 ) o wheel : o wheel 0.44.0 0.43.0 o pip 24.2 24.1 o setuptools 74.1.2 70.1.0 (#2760 ) v20.26.3 (2024-06-21) - 20.26.3 o wheel : o setuptools 70.1.0 69.5.1 o pip 24.1 24.0 (#2741 ) v20.26.2 (2024-05-13) - 20.26.2 o virtualenv.pyz (symlink) zipapp - @HandSonic @petamas . (#1949 ) o activate.sh hashing - :user:'fenkes-ibm'. (#2717 ) v20.26.1 (2024-04-29) - 20.26.1 o Python PATH Windows - @ofek . (#2712 ) v20.26.0 (2024-04-23) - 20.26.0 o ( python3.12) (builtin discovery) ( python3) - @flying-sheep . (#2709 ) v20.25.3 (2024-04-17) - 20.25.3 o pathmod parser Python 3.13.0a6. (#2702 ) v20.25.2 (2024-04-16) - 20.25.2 o wheel : o setuptools 69.1.0 69.5.1 o wheel 0.42.0 0.43.0 (#2699 ) - 20.25.1 o wheel : o setuptools 69.0.2 69.0.3 o pip 23.3.1 23.3.2 (#2681 ) o wheel : o pip 23.3.2 24.0 o setuptools 69.0.3 69.1.0. (#2691 ) - 20.25.1 o #2688 v20.25.0 (2023-12-01) - 20.25.0 o CI Python 3.13.0a2 - @hroncok . (#2673 ) - 20.25.0 o wheel : o wheel 0.41.2 0.41.3 (#2665 ) o wheel : o wheel 0.41.3 0.42.0 o setuptools 68.2.2 69.0.2 (#2669 ) v20.24.6 (2023-10-23) - 20.24.6 o get_hookimpls . (#2649 ) o wheel : o setuptools 68.2.0 68.2.2 o pip 23.2.1 23.3.1 (#2656 ) v20.24.5 (2023-09-08) - 20.24.5 o PyPy 3.10 - @cclauss . (#2638 ) o Brew macOS (copy builds) - @gaborbernat . (#2640 ) o wheel : o setuptools 68.1.2 68.2.0 (#2642 ) v20.24.4 (2023-08-30) - 20.24.4 o wheel : o setuptools 68.1.0 68.1.2 3.8+ o wheel 0.41.1 0.41.2 3.7+ (#2628 ) - 20.24.3 o ResourceWarning (#2472 ) o wheel : o wheel 0.41.0 0.41.1 (#2622 ) - 20.24.3 o #2610 v20.24.2 (2023-07-24) - 20.24.2 o wheel : o pip 23.2 23.2.1 o wheel 0.40.0 0.41.0 (#2614 ) v20.24.1 (2023-07-19) - 20.24.1 o wheel : o pip 23.1.2 23.2 - @arielkirkwood (#2611 ) v20.24.0 (2023-07-14) - 20.24.0 o (prompt prefix) VIRTUAL_ENV_PROMPT - @jimporter . (#2194 ) - 20.24.0 o - @gaborbernat . (#2592 ) o wheel : o setuptools 67.8.0 68.0.0 (#2607 ) v20.23.1 (2023-06-16) - 20.23.1 o nushell Windows command not found - @melMass . (#2572 ) o wheel : o setuptools 67.7.2 67.8.0 (#2588 ) v20.23.0 (2023-04-27) - 20.23.0 o (seed) wheel setuptools Python 3.12+. : o wheel VIRTUALENV_WHEEL=bundle --wheel=bundle o setuptools VIRTUALENV_SETUPTOOLS=bundle --setuptools=bundle . @chrysle . (#2487 ) o 3.12 - @gaborbernat . (#2558 ) o PermissionError venv - @kulikjak . (#2543 ) o setuptools 67.6.1 67.7.2 pip 23.1 23.1.2 - @szleb . (#2560 ) v20.22.0 (2023-04-19) - 20.22.0 o Python <=3.6 ( ). pip 20.3.4 21.3.1 wheel 0.37.1 setuptools 59.6.0 44.1.1 50.3.2 - @gaborbernat . (#2548 ) v20.21.1 (2023-04-19) - 20.21.1 o tox.ini sdist - @mtelka . (#2511 ) o 'let' nushell nushell 'let' . (#2527 ) o 'str collect' nushell 'str join' . activate.nu . (#2532 ) o wheel : o wheel 0.38.4 0.40.0 o setuptools 67.4.0 67.6.1 o pip 23.0.1 23.1 (#2546 ) v20.21.0 (2023-03-12) - 20.21.0 o closure {||. (#2512 ) - 20.21.0 o print print_prompt nushell nushell stdout . (#2514 ) o . (#2515 ) o ReentrantFileLock (thread-safe) virtualenv.cli_run - @radoering . (#2516 ) v20.20.0 (2023-02-28) - 20.20.0 o Nushell . (#2506 ) - 20.20.0 o CPython Windows - @faph . (#2504 ) o setuptools 67.1.0 67.4.0 pip 23.0 23.0.1 - @gaborbernat . (#2510 ) v20.19.0 (2023-02-07) - 20.19.0 o 3 platformdirs - @cdce8p . (#2499 ) v20.18.0 (2023-02-06) - 20.18.0 o 3.6 ( 2.7+ ) - @gaborbernat . (#2489 ) o Nushell - @kubouc . (#2481 ) o pip 23.0 setuptools 67.1 - @gaborbernat . (#2489 ) v20.17.1 (2022-12-05) - 20.17.1 o py python CPython - @gaborbernat . (#2460 ) o VIRTUAL_ENV_DISABLE_PROMPT activate.nu - @m-lima . (#2461 ) v20.17.0 (2022-11-27) - 20.17.0 o Nushell overlay. (#2422 ) o Nushell . (#2450 ) - 20.17.0 o API importlib.resources . - @gaborbernat . (#2448 ) o setuptools 65.6.3 65.5.1 - @gaborbernat . (#2451 ) v20.16.7 (2022-11-12) - 20.16.7 o "home" pyvenv.cfg PEP 405 - @vfazio . (#2440 ) o POSIX sys._base_executable - @vfazio . (#2442 ) o wheel 0.38.4 pip 22.3.1 22.3 setuptools 65.5.1 65.5.0 - @gaborbernat . (#2443 ) v20.16.6 (2022-10-25) - 20.16.6 o (shim) PyPy3 (#2426 ) - 20.16.6 o (scheme) . python3-distutils venv - @asottile . (#2350 ) o C shell ( tcsh) - @kulikjak . (#2418 ) o (fallback) wheel - @schaap . (#2429 ) o setuptools 65.5.0 65.3.0 pip 22.3 22.2.2 - @gaborbernat . (#2434 ) v20.16.5 (2022-09-07) - 20.16.5 o echo (activate.bat deactivate.bat) - @pawelszramowski . (#2411 ) v20.16.4 (2022-08-29) - 20.16.4 o setuptools 65.3 - @gaborbernat . (#2405 ) v20.16.3 (2022-08-04) - 20.16.3 o pip 22.2.2 22.2.1 setuptools 63.4.1 63.2.0 - @gaborbernat . (#2395 ) - 20.16.2 o pip 22.2 22.2.1 - @gaborbernat . (#2391 ) v20.16.1 (2022-07-26) - 20.16.1 o Nushell 0.67 - @kubouch . (#2386 ) v20.16.0 (2022-07-25) - 20.16.0 o Python 2 ( Python 2 ) - @gaborbernat . (#2382 ) o pip 22.2 22.1.2 setuptools 63.2.0 62.6.0 - @gaborbernat . (#2383 ) v20.15.1 (2022-06-28) - 20.15.1 o setuptools stdout . (#2335 ) o DLLs CPython3Windows. (#2368 ) v20.15.0 (2022-06-25) - 20.15.0 o (Windows embeddable Python package): python.zip - @reksarka . (#1774 ) - 20.15.0 o setuptools 62.3.3 62.6.0 pip 22.1.2 22.0.4 - @gaborbernat . (#2348 ) o shlex.quote pipes.quote Python 3 - @frenzymadness . (#2351 ) o Windows PyPy 3.6 - @reksarka . (#2363 ) v20.14.1 (2022-04-11) - 20.14.1 o Python 2.7 macOS 12 - @nickhutchinson . (#2284 ) - 20.14.1 o setuptools 62.1.0 61.0.0 - @gaborbernat . (#2327 ) v20.14.0 (2022-03-25) - 20.14.0 o Nushell nu 0.60 - @kubouch . (#2321 ) - 20.14.0 o setuptools 61.0.0 60.10.0 - @gaborbernat . (#2322 ) v20.13.4 (2022-03-18) - 20.13.4 o - @asottile . (#2317 ) o setuptools 60.10.0 60.9.3 - @gaborbernat . (#2320 ) v20.13.3 (2022-03-07) - 20.13.3 o (symlink) /usr +PyPy3.8 - @stefanor . (#2310 ) o pip 22.0.3 22.0.4 - @gaborbernat . (#2311 ) - 20.13.2 o setuptools 60.6.0 60.9.3 - @gaborbernat . (#2306 ) v20.13.1 (2022-02-05) - 20.13.1 o "execv() arg 2 must contain only strings" M1 MacOS (#2282 ) o setuptools 60.2.0 60.5.0 - @asottile . (#2289 ) o pip 22.0.3 setuptools 60.6.0 - @gaborbernat @asottile . (#2294 ) v20.13.0 (2022-01-02) - 20.13.0 o wheel JSON wheel. - @mayeut . (#2268 ) - 20.13.0 o AttributeError: 'bool' object has no attribute 'error' virtualenv 2.x macOS - moreati. (#2269 ) o PermissionError: [Errno 1] Operation not permitted virtualenv 2.x macOS/arm64 - moreati. (#2271 ) v20.12.1 (2022-01-01) - 20.12.1 o pip setuptools wheel wheel - @mayeut . (#2265 ) o pip setuptools wheel . - @mayeut . (#2266 ) o pip setuptools wheel - @mayeut . (#2267 ) v20.12.0 (2021-12-31) - 20.12.0 o python2 Darwin arm64 - @tmspicer . (#2233 ) - 20.12.0 o --download - @mayeut . (#2120 ) o setuptools 60.1.1 60.2.0 - @gaborbernat . (#2263 ) v20.11.2 (2021-12-29) - 20.11.2 o (pinned) pip setuptools wheel - @mayeut . (#2203 ) v20.11.1 (2021-12-29) - 20.11.1 o setuptools 60.1.0 60.1.1 - @gaborbernat . (#2258 ) v20.11.0 (2021-12-28) - 20.11.0 o py-filelock - @ofek . (#2237 ) o setuptools 58.3.0 61.1.0 - @gaborbernat . (#2240 ) o backports.entry-points-selectable - @hroncok . (#2246 ) o Fish: PATH - @d3dave . (#2248 ) - 20.10.0 o "venv" sysconfig virtualenv . Python Fedora / . Python venv - hroncok (#2208 ) o () virtualenv . --prompt virtualenv venv . (#2224 ) - 20.10.0 o activate.bat - @SiggyBar . (#2225 ) v20.9.0 (2021-10-23) - 20.9.0 o --prompt . - @rkm . (#2220 ) o libffi-8.dll pypy #2218 - @mattip - 20.9.0 o PyPy3.8 PermissionError - @mgorny . (#2182 ) o setuptools 58.1.0 58.3.0 pip 21.2.4 21.3.1 - @gaborbernat . (#2205 ) o activate.bat - @SiggyBar . (#2221 ) v20.8.1 (2021-09-24) - 20.8.1 o venv wheel (seeded) .dist-info (entrypoint) - @arcivanov (#2185 ) o setuptools 58.0.4 58.1.0 - @gaborbernat . (#2195 ) - 20.8.1 o #2189 v20.8.0 (2021-09-16) o setuptools 57.4.0 58.0.4 pip 21.2.3 21.2.4 o nushell v20.7.2 (2021-08-10) - 20.7.2 o pip 21.2.2 21.2.3 wheel 0.36.2 0.37.0 - @gaborbernat . (#2168 ) v20.7.1 (2021-08-09) - 20.7.1 o PythonInfo.install_path (#2165 ) v20.7.0 (2021-07-31) - 20.7.0 o pip 21.1.3 21.2.2 setuptools 57.1.0 57.4.0 - @gaborbernat (#2159 ) - 20.7.0 o (activator) xonsh CI - @gaborbernat . (#2160 ) - 20.6.0 o Python distutils ( syconfig ) - @gaborbernat . (#1910 ) v20.5.0 (2021-07-13) - 20.5.0 o 'selectable' - @jaraco . (#2093 ) o libffi-7.dll dll PyPy (#2141 ) o platformdirs appdirs - @gaborbernat . (#2142 ) - 20.5.0 o pip 21.1.3 setuptools 57.1.0 - @gaborbernat . (#2135 ) - 20.5.0 o python 3.4 EOL - @gaborbernat . (#2141 ) v20.4.7 (2021-05-24) - 20.4.7 o pip 21.1.2 setuptools 57.0.0 - @gaborbernat . (#2123 ) v20.4.6 (2021-05-05) - 20.4.6 o site.getsitepackages() python2 debian - @freundTech . (#2105 ) v20.4.5 (2021-05-05) - 20.4.5 o pip 21.1.1 21.0.1 - @gaborbernat . (#2104 ) o --system-site-packages site.getsitepackages() python2 - @freundTech . (#2106 ) v20.4.4 (2021-04-20) - 20.4.4 o discovery . (#2087 ) o setuptools 56.0.0 @gaborbernat . (#2094 ) v20.4.3 (2021-03-16) - 20.4.3 o setuptools 52.0.0 54.1.2 - @gaborbernat (#2069 ) o stdlib PyPy3 Windows - @gaborbernat . (#2071 ) v20.4.2 (2021-02-01) - 20.4.2 o virtualenv --upgrade-embed-wheels - @gaborbernat . (#2058 ) v20.4.1 (2021-01-31) - 20.4.1 o pip setuptools (21.0.1 52.0.0) - @gaborbernat . (#2060 ) v20.4.0 (2021-01-19) - 20.4.0 o API os.environ - @gaborbernat . (#2054 ) o setuptools 51.3.3 51.1.2 - @gaborbernat . (#2055 ) v20.3.1 (2021-01-13) - 20.3.1 o pip 20.3.3 setuptools 51.1.1 wheel 0.36.2 - @gaborbernat . (#2036 ) o (unfunctioning) pydoc virtualenv Zsh set -e ( Zsh unset -f unfunction ) - @d125q . (#2049 ) o python ( shim - pyenv ) - @gaborbernat . (#2050 ) v20.3.0 (2021-01-10) - 20.3.0 o --try-first-with . python - @gaborbernat . (#2046 ) - 20.3.0 o python 3.7+ shim exe - @gaborbernat . (#1986 ) o PEP-514 PythonCore . virtualenv pip conda - @gaborbernat . (#2046 ) v20.2.2 (2020-12-07) - 20.2.2 o pip 20.3.1 setuptools 51.0.0 wheel 0.36.1 - @gaborbernat . (#2029 ) v20.2.1 (2020-11-23) . v20.2.0 (2020-11-21) - 20.2.0 o ignore VCS virtualenv no-vcs-ignore <#no- vcs-ignore> False . (#2003 ) o --read-only-app-data app data . ( ) docker app-data . ENV \ VIRTUALENV_OVERRIDE_APP_DATA=/opt/virtualenv/cache \ VIRTUALENV_SYMLINK_APP_DATA=1 RUN virtualenv venv && rm -rf venv ENV VIRTUALENV_READ_ONLY_APP_DATA=1 USER nobody # this virtualenv has symlinks into the read-only app-data cache RUN virtualenv /tmp/venv @asottile . (#2009 ) - 20.2.0 o VIRTUALENV_PYTHON ( ) - @pneff . (#1998 ) v20.1.0 (2020-10-25) - 20.1.0 o python - @gaborbernat . (#1995 ) - 20.0.35 o setuptools 50.3.0 50.3.1 - @gaborbernat . (#1982 ) o virtualenv cwd subprocess invalid directory - @gaborbernat . (#1983 ) v20.0.34 (2020-10-12) - 20.0.34 o venv . - @gaborbernat . (#1782 ) o Cygwin - @davidcoghlan . (#1969 ) v20.0.33 (2020-10-04) - 20.0.33 o None cygwin POSIX dest - @danyeaw . (#1962 ) o Python 3.4 ( CI) - @gaborbernat . (#1963 ) v20.0.32 (2020-10-01) - 20.0.32 o UNIX ( BATCH ) - @saytosid . (#1818 ) o pip 20.2.1 setuptools 49.4.0 - @gaborbernat . (#1918 ) o seed Windows - @gaborbernat . (#1928 ) o (race condition) . (#1938 ) o setuptools 50.2.0 pip 20.2.3 - @gaborbernat . (#1939 ) o bash cygwin msys2 - @danyeaw . (#1940 ) o importlib version<3 - @usamasadiq (#1953 ) o pth CPython2 $PYTHONPATH site-packages/ - @navytux . (#1959 ) (#1960 ) v20.0.31 (2020-08-17) - 20.0.31 o pip 20.2.1 setuptools 49.6.0 wheel 0.35.1 - @gaborbernat . (#1918 ) v20.0.30 (2020-08-04) - 20.0.30 o pip 20.2.1 setuptools 49.2.1 - @gaborbernat . (#1915 ) v20.0.29 (2020-07-31) - 20.0.29 o pip 20.1.2 20.2 - @gaborbernat . (#1909 ) v20.0.28 (2020-07-24) - 20.0.28 o Python - @gaborbernat . (#1882 ) o setup_logging API - @gaborbernat . (#1896 ) o \n \r\n ( Python ) - @gaborbernat . (#1905 ) v20.0.27 (2020-07-15) - 20.0.27 o (preimport) threading gpython gevent - @navytux . (#1897 ) o setuptools 49.2.0 Python 3.5+ - @gaborbernat . (#1898 ) - 20.0.26 o distutils >= 0.3.1 - @gaborbernat . (#1880 ) o : o ( _VIRTUALENV_PERIODIC_UPDATE_INLINE ) o (unverified context) PyPi o wheel @gaborbernat . (#1883 ) o SystemExit(0) - @gaborbernat . (#1885 ) o setuptools 47.3.1 49.1.0 Python 3.5+ - @gaborbernat . (#1887 ) v20.0.25 (2020-06-23) - 20.0.25 o app-data . . @gaborbernat . (#1869 ) v20.0.24 (2020-06-22) - 20.0.24 o : o wheel upgrade-embed-wheels <# upgrade-embed-wheels> o ( ) wheel ( no-periodic-update <#no-periodic-update> ) Wheel acquisition <#wheels> - @gaborbernat . (#1821 ) o wheel : o wheel Python 3.9 3.10 o setuptools Python 3.5+ 47.1.1 47.3.1 @gaborbernat . (#1841 ) o (seed) : created virtual environment CPython3.8.3.final.0-64 in 350ms creator CPython3Posix(dest=/x, clear=True, global=False) seeder FromAppData(download=False, pip=bundle, setuptools=bundle, wheel=bundle, via=copy, app_data_dir=/y/virtualenv) added seed packages: pip==20.1.1, setuptools==47.3.1, wheel==0.34.2 @gaborbernat . (#1864 ) - 20.0.24 o .gitignore - @gaborbernat . (#1862 ) o .dist-info app-data - @gaborbernat . (#1867 ) - 20.0.24 o ( ) wheel Wheel acquisition <#wheels> - @gaborbernat . (#1821 ) o wheel Distribution maintainer patching <#distribution-wheels> - @gaborbernat . (#1840 ) - 20.0.23 o setup.cfg - @RowdyHowell . (#1857 ) v20.0.22 (2020-06-12) - 20.0.22 o importlib.resources - @asottile . (#1846 ) o setuptools 44.1.1 python 2 47.1.1 python3.5+ - @gaborbernat . (#1855 ) v20.0.21 (2020-05-20) - 20.0.21 o ignore . . git - @gaborbernat . (#1806 ) - 20.0.21 o virtualenv --clear-app-data clear <#clear> . reset-app-data <# reset-app-data> - @gaborbernat . (#1824 ) o setuptools 46.4.0 46.1.3 Python 3.5+ pip 20.1 20.1.1 - @gaborbernat . (#1827 ) o seeder pip --extra-search-dir - @frenzymadness . (#1834 ) v20.0.20 (2020-05-04) - 20.0.20 o python 3.4 - @gaborbernat . (#1809 ) o CPython2 _get_makefile_filename get_makefile_filename sysconfig - @ianw . (#1810 ) o True download - @gaborbernat . (#1813 ) o seed app-data wheel - @gaborbernat . (#1814 ) v20.0.19 (2020-05-03) - 20.0.19 o Python 2 Python 3 (activator) python - @gaborbernat . (#1776 ) o Invalid Requirement seed seeder app-data - @gaborbernat . (#1779 ) o (interpreter discovery) - @gaborbernat . (#1781 ) o POSIX CPython2 syconfig.get_makefile_filename ( C - numpy - ) - @gaborbernat . (#1783 ) o copies <# copies> symlinks <#symlinks>. : CLI . (copy) (symlink) - @gaborbernat . (#1784 ) o pip Python 2.7 3.5+ 20.0.2 20.1 - @gaborbernat . (#1793 ) o CPython Windows python Windows - @gaborbernat . (#1796 ) o symlink (creators) - @asottile (#1803 ) v20.0.18 (2020-04-16) - 20.0.18 o (import) setuptools cli_run distutils.dist.Distribution setuptools python - @gaborbernat . (#1771 ) v20.0.17 (2020-04-09) - 20.0.17 o ( VIRTUALENV_COPIES VIRTUALENV_ALWAYS_COPY ) - @gaborbernat . (#1763 ) - 20.0.16 o wheel (seed wheel) extra-search-dir <#extra-search-dir> Requires-Python python - @gaborbernat . (#1757 ) v20.0.15 (2020-03-27) - 20.0.15 o setuptools 46.1.1 46.1.3 - @gaborbernat . (#1752 ) v20.0.14 (2020-03-25) - 20.0.14 o __PYVENV_LAUNCHER__ macOS Python 3.7.(<8) 3.8.(<3) pth - @gaborbernat . (#1704 ) o setuptools Python 3.5+ 46.1.1 Python 2.7 44.1.0 - @gaborbernat . (#1745 ) - 20.0.14 o PATH spec - @gaborbernat . (#1746 ) v20.0.13 (2020-03-19) - 20.0.13 o pyc Python 2 - @gaborbernat . (#1738 ) o include sysconfig distutils - @gaborbernat . (#1739 ) v20.0.12 (2020-03-19) - 20.0.12 o - @gaborbernat . (#1734 ) v20.0.11 (2020-03-18) - 20.0.11 o ( / - Jython CPython/PyPy ) - @gaborbernat . (#1716 ) - 20.0.11 o Python 3 Framework XCode macOS Catalina - @gaborbernat . (#1663 ) o Python Windows Store (symlink) - @gaborbernat . (#1709 ) o AttributeError activate_this.py cross python - @gaborbernat . (#1710 ) o --no-pip --no-setuptools --no-wheel - @gaborbernat . (#1712 ) o .py .pyc - @tucked . (#1714 ) o distutils/setuptools C ( zipimporter Python 3.7 ) - @gaborbernat . (#1715 ) o Python 2 (landmark) site.py ( RHEL amazonlinux:1) - @gaborbernat . (#1719 ) o Python - - @gaborbernat . (#1721 ) o pipx.y pip-x.y pip - @gaborbernat . (#1723 ) o - @gaborbernat . (#1728 ) o <#compatibility-requirements> Python - @gaborbernat . (#1714 ) v20.0.10 (2020-03-10) - 20.0.10 o python distutils - @gaborbernat . (#1663 ) o setuptools 45.3.0 46.0.0 Python 3.5+ - @gaborbernat . (#1702 ) - 20.0.10 o (pip + ) pip - @gaborbernat . (#1618 ) o PEP-518 - @gaborbernat . (#1619 ) o Github - @gaborbernat . (#1620 ) v20.0.9 (2020-03-08) - 20.0.9 o pythonw.exe python.exe Windows - @gaborbernat . (#1686 ) o (legacy loaders) virtualenv distutils - @gaborbernat . (#1690 ) o python 2 (landmark files) stdlib platstdlib ( RHEL) - @gaborbernat . (#1694 ) o setuptools 45.2.0 45.3.0 Python 3.5+ - @gaborbernat . (#1699 ) v20.0.8 (2020-03-04) - 20.0.8 o distutils prefix install_scripts - @gaborbernat . (#1663 ) o PYTHONPATH Python 2 -- @jd . (#1673 ) o - @gaborbernat . (#1674 ) o Batch - @spetafree . (#1679 ) o virtualenv Python 2 - setuptools - @gaborbernat . (#1682 ) o (entry points) Python 2 setuptools easy_install.pth - @gaborbernat . (#1684 ) o attr: setuptools - @gaborbernat . (#1685 ) v20.0.7 (2020-02-26) - 20.0.7 o distutils python 3 pypa/pip #7778 - @gaborbernat . (#1669 ) v20.0.6 (2020-02-26) - 20.0.6 o site-package python macOS - @gaborbernat . (#1561 ) o - @gaborbernat . (#1600 ) o ( ) - @gaborbernat . (#1632 ) o : o app-data <#app-data> o clear-app-data app-data o o o symlink-app-data <#symlink-app-data> False @gaborbernat . (#1640 ) o PyPy 2 - @gaborbernat . (#1652 ) o - @nsoranzo . (#1660 ) o zipapp ( python 3.7+) - @gaborbernat . (#1666 ) - 20.0.5 (Features) o pythonX.X virtualenv pypy - @asottile (#1612 ) o setuptools setuptools-scm >= 2 setuptools-scm (CentOS 7 ) - @gaborbernat . (#1621 ) o - @gaborbernat (#1641 ) - 20.0.5 (Bugfixes) o Framework macOs ( CI brew ) - @gaborbernat (#1561 ) o libpypy-c.so pypy symlink - @asottile (#1614 ) o python - @PrajwalM2212 (#1624 ) o (cross interpreter) sys.base_executable __PYVENV_LAUNCHER__ - @cjolowicz (#1643 ) v20.0.4 (2020-02-14) - 20.0.4 (Features) o - @asottile . (#1596 ) - 20.0.4 (Bugfixes) o / Windows - vphilippon (#1582 ) o six 1.9 - ssbarnea (#1606 ) v20.0.3 (2020-02-12) - 20.0.3 (Bugfixes) o Python 2 Apple Framework system-site-packages <# system-site-packages> (site package) - @gaborbernat . (#1561 ) o python ( ..) python - @gaborbernat . (#1583 ) o API from virtualenv import cli_run - @gaborbernat . (#1585 ) o .dist-info.virtualenv app-data seeder <# seeder> importlib.metadata .virtualenv - @gaborbernat . (#1589 ) - 20.0.3 (Improved Documentation) o API from virtualenv import cli_run Python <#programmatic-api> - @gaborbernat . (#1585 ) v20.0.2 (2020-02-11) - 20.0.2 (Features) o verbose <#verbose> quiet <#quiet> - @pradyunsg . (#1557 ) o virtualenv VIRTUALENV_OVERRIDE_APP_DATA - @asottile . (#1559 ) o / ( venv ) - @gaborbernat . (#1568 ) o with-traceback <#with-traceback> (stacktrace) virtualenv - @gaborbernat . (#1572 ) - 20.0.2 (Bugfixes) o ( pip) app-data seeder <#seeder> - @gaborbernat . (#997 ) o python: o PATH ( ) o @gaborbernat . (#1545 ) o ( ) ( Framework Python macOs) - @gaborbernat . (#1561 ) o python warning info ( Python ) - @gaborbernat . (#1574 ) o app-data seeder <#seeder> UNIX (symlink) Windows . symlink-app-data <#symlink-app-data> - @gaborbernat . (#1575 ) o @jezdez . (#1547 ) o : - @pradyunsg . (#1548 ) v20.0.1 (2020-02-10) - 20.0.1 o setuptools 45.2.0 45.1.0 Python 3.4+ - @gaborbernat . (#1554 ) - 20.0.1 o Windows - @gaborbernat . (#1552 ) o venv - @gaborbernat . (#1553 ) v20.0.0. (2020-02-10) - 20.0.0. o . CLI. env var config . related links - @pradyunsg . (#1540 ) v20.0.0b2 (2020-02-04) - 20.0.0b2 o : o (debug) o : (major) (minor) (patch) ( virtualenv ) o system_executable venv/virtualenv ( virtualenv - virtualenv ) @gaborbernat . (#1515 ) o bash fish Windows ( git bash cygwin msys2 ) - @gaborbernat . (#1527 ) o wheel 0.34.0 0.34.2 - @gaborbernat . (#1531 ) - 20.0.0b2 o Bash .sh ( virtualenvwrapper ) - @gaborbernat . (#1508 ) o (-v): o ( ) o str_spec PythonSpec o (seeder) app-data @gaborbernat . (#1510 ) o ( ) - @gaborbernat . (#1512 ) o -p - @gaborbernat . (#1514 ) o app data - @gaborbernat . (#1516 ) o pth Debian CPython2 - @gaborbernat . (#1517 ) o fish 3.10 $pipestatus - @krobelus . (#1530 ) o pyenv.cfg include-system-site-packages - user:gaborbernat. (#1535 ) o - @gaborbernat . (#1465 ) o readme reStructuredText MarkDown - @gaborbernat . (#1531 ) v20.0.0b1 (2020-01-28) o . o --download False o site virtualenv . Python 2 (shim) . : virtualenv . 0.8 16.7.9 . 20.0.0b1 . (legacy) . (AUTHORS) (COPYRIGHT) 2007-2026, PyPA, PyPA 21.7 September 1, 2026 VIRTUALENV(1)