'\" t .\" Man page generated from reStructuredText. . . .nr rst2man-indent-level 0 . .de1 rstReportMargin \\$1 \\n[an-margin] level \\n[rst2man-indent-level] level margin: \\n[rst2man-indent\\n[rst2man-indent-level]] - \\n[rst2man-indent0] \\n[rst2man-indent1] \\n[rst2man-indent2] .. .de1 INDENT .\" .rstReportMargin pre: . RS \\$1 . nr rst2man-indent\\n[rst2man-indent-level] \\n[an-margin] . nr rst2man-indent-level +1 .\" .rstReportMargin post: .. .de UNINDENT . RE .\" indent \\n[an-margin] .\" old: \\n[rst2man-indent\\n[rst2man-indent-level]] .nr rst2man-indent-level -1 .\" new: \\n[rst2man-indent\\n[rst2man-indent-level]] .in \\n[rst2man-indent\\n[rst2man-indent-level]]u .. .TH "VIRTUALENV" "1" "November 08, 2024" "20.27" "virtualenv" .SH NAME virtualenv \- virtualenv 20.27.1 \X'tty: link https://pypi.org/project/virtualenv/#history'\fI\%Latest version on PyPI\fP\X'tty: link'[image: PyPI - Implementation] [image] [image: PyPI - Python Version] [image] \X'tty: link https://virtualenv.pypa.io'\fI\%Documentation status\fP\X'tty: link'\X'tty: link https://discord.gg/pypa'\fI\%Discord\fP\X'tty: link'\X'tty: link https://pypistats.org/packages/virtualenv'\fI\%PyPI \- Downloads\fP\X'tty: link'\X'tty: link https://opensource.org/licenses/MIT'\fI\%PyPI \- License\fP\X'tty: link'\X'tty: link https://github.com/pypa/virtualenv/issues'\fI\%Open issues\fP\X'tty: link'\X'tty: link https://github.com/pypa/virtualenv/pulls'\fI\%Open pull requests\fP\X'tty: link'\X'tty: link https://pypistats.org/packages/virtualenv'\fI\%Package popularity\fP\X'tty: link' .sp \fBvirtualenv\fP is a tool to create isolated Python environments. Since Python \fB3.3\fP, a subset of it has been integrated into the standard library under the \X'tty: link https://docs.python.org/3/library/venv.html'\fI\%venv module\fP\X'tty: link'\&. The \fBvenv\fP module does not offer all features of this library, to name just a few more prominent: .INDENT 0.0 .IP \(bu 2 is slower (by not having the \fBapp\-data\fP seed method), .IP \(bu 2 is not as extendable, .IP \(bu 2 cannot create virtual environments for arbitrarily installed python versions (and automatically discover these), .IP \(bu 2 is not upgrade\-able via \X'tty: link https://pip.pypa.io/en/stable/installing/'\fI\%pip\fP\X'tty: link', .IP \(bu 2 does not have as rich programmatic API (describe virtual environments without creating them). .UNINDENT .sp The basic problem being addressed is one of dependencies and versions, and indirectly permissions. Imagine you have an application that needs version \fB1\fP of \fBLibFoo\fP, but another application requires version \fB2\fP\&. How can you use both these libraries? If you install everything into your host python (e.g. \fBpython3.8\fP) it\(aqs easy to end up in a situation where two packages have conflicting requirements. .sp Or more generally, what if you want to install an application \fIand leave it be\fP? If an application works, any change in its libraries or the versions of those libraries can break the application. Also, what if you can\(aqt install packages into the global \fBsite\-packages\fP directory, due to not having permissions to change the host python environment? .sp In all these cases, \fBvirtualenv\fP can help you. It creates an environment that has its own installation directories, that doesn\(aqt share libraries with other virtualenv environments (and optionally doesn\(aqt access the globally installed libraries either). .SH USEFUL LINKS .sp \fBRelated projects, that build abstractions on top of virtualenv\fP .INDENT 0.0 .IP \(bu 2 \X'tty: link https://pypi.org/project/virtualenvwrapper'\fI\%virtualenvwrapper\fP\X'tty: link' \- a useful set of scripts for creating and deleting virtual environments .IP \(bu 2 \X'tty: link https://pypi.org/project/pew'\fI\%pew\fP\X'tty: link' \- provides a set of commands to manage multiple virtual environments .IP \(bu 2 \X'tty: link https://pypi.org/project/tox'\fI\%tox\fP\X'tty: link' \- a generic virtualenv management and test automation command line tool, driven by a \fBtox.ini\fP configuration file .IP \(bu 2 \X'tty: link https://pypi.org/project/nox'\fI\%nox\fP\X'tty: link' \- a tool that automates testing in multiple Python environments, similar to tox, driven by a \fBnoxfile.py\fP configuration file .UNINDENT .sp \fBTutorials\fP .INDENT 0.0 .IP \(bu 2 \X'tty: link https://www.youtube.com/watch?v=N5vscPTWKOk'\fI\%Corey Schafer tutorial\fP\X'tty: link' on how to use it .IP \(bu 2 \X'tty: link http://code.google.com/p/modwsgi/wiki/VirtualEnvironments'\fI\%Using virtualenv with mod_wsgi\fP\X'tty: link' .UNINDENT .sp \fBPresenting how the package works from within\fP .INDENT 0.0 .IP \(bu 2 \X'tty: link https://www.youtube.com/watch?v=o1Vue9CWRxU'\fI\%Bernat Gabor: status quo of virtual environments\fP\X'tty: link' .IP \(bu 2 \X'tty: link http://pyvideo.org/video/568/reverse-engineering-ian-bicking--39-s-brain--insi'\fI\%Carl Meyer: Reverse\-engineering Ian Bicking\(aqs brain: inside pip and virtualenv\fP\X'tty: link' .UNINDENT .SS Installation .SS via pipx .sp \X'tty: link https://pypi.org/project/virtualenv'\fI\%virtualenv\fP\X'tty: link' is a CLI tool that needs a Python interpreter to run. If you already have a \fBPython 3.7+\fP interpreter the best is to use \X'tty: link https://pypi.org/project/pipx'\fI\%pipx\fP\X'tty: link' to install virtualenv into an isolated environment. This has the added benefit that later you\(aqll be able to upgrade virtualenv without affecting other parts of the system. .INDENT 0.0 .INDENT 3.5 .sp .EX pipx install virtualenv virtualenv \-\-help .EE .UNINDENT .UNINDENT .SS via pip .sp Alternatively you can install it within the global Python interpreter itself (perhaps as a user package via the \fB\-\-user\fP flag). Be cautious if you are using a python install that is managed by your operating system or another package manager. \fBpip\fP might not coordinate with those tools, and may leave your system in an inconsistent state. Note, if you go down this path you need to ensure pip is new enough per the subsections below: .INDENT 0.0 .INDENT 3.5 .sp .EX python \-m pip install \-\-user virtualenv python \-m virtualenv \-\-help .EE .UNINDENT .UNINDENT .SS wheel .sp Installing virtualenv via a wheel (default with pip) requires an installer that can understand the \fBpython\-requires\fP tag (see \X'tty: link https://www.python.org/dev/peps/pep-0503/'\fI\%PEP\-503\fP\X'tty: link'), with pip this is version \fB9.0.0\fP (released 2016 November). Furthermore, in case you\(aqre not installing it via the PyPi you need to be using a mirror that correctly forwards the \fBpython\-requires\fP tag (notably the OpenStack mirrors don\(aqt do this, or older \X'tty: link https://github.com/devpi/devpi'\fI\%devpi\fP\X'tty: link' versions \- added with version \fB4.7.0\fP). .SS sdist .sp When installing via a source distribution you need an installer that handles the \X'tty: link https://www.python.org/dev/peps/pep-0517/'\fI\%PEP\-517\fP\X'tty: link' specification. In case of \fBpip\fP this is version \fB18.0.0\fP or later (released on 2018 July). If you cannot upgrade your pip to support this you need to ensure that the build requirements from \X'tty: link https://github.com/pypa/virtualenv/blob/main/pyproject.toml#L2'\fI\%pyproject.toml\fP\X'tty: link' are satisfied before triggering the install. .SS via zipapp .sp You can use virtualenv without installing it too. We publish a Python \X'tty: link https://docs.python.org/3/library/zipapp.html'\fI\%zipapp\fP\X'tty: link', you can just download this from \X'tty: link https://bootstrap.pypa.io/virtualenv.pyz'\fI\%https://bootstrap.pypa.io/virtualenv.pyz\fP\X'tty: link' and invoke this package with a python interpreter: .INDENT 0.0 .INDENT 3.5 .sp .EX python virtualenv.pyz \-\-help .EE .UNINDENT .UNINDENT .sp The root level zipapp is always the current latest release. To get the last supported zipapp against a given python minor release use the link \fBhttps://bootstrap.pypa.io/virtualenv/x.y/virtualenv.pyz\fP, e.g. for the last virtualenv supporting Python 3.11 use \X'tty: link https://bootstrap.pypa.io/virtualenv/3.11/virtualenv.pyz'\fI\%https://bootstrap.pypa.io/virtualenv/3.11/virtualenv.pyz\fP\X'tty: link'\&. .sp If you are looking for past version of virtualenv.pyz they are available here: .INDENT 0.0 .INDENT 3.5 .sp .EX https://github.com/pypa/get\-virtualenv/blob//public//virtualenv.pyz?raw=true .EE .UNINDENT .UNINDENT .SS latest unreleased .sp Installing an unreleased version is discouraged and should be only done for testing purposes. If you do so you\(aqll need a pip version of at least \fB18.0.0\fP and use the following command: .INDENT 0.0 .INDENT 3.5 .sp .EX pip install git+https://github.com/pypa/virtualenv.git@main .EE .UNINDENT .UNINDENT .SS Python and OS Compatibility .sp virtualenv works with the following Python interpreter implementations: .INDENT 0.0 .IP \(bu 2 \X'tty: link https://www.python.org/'\fI\%CPython\fP\X'tty: link': \fB3.12 >= python_version >= 3.7\fP .IP \(bu 2 \X'tty: link https://pypy.org/'\fI\%PyPy\fP\X'tty: link': \fB3.10 >= python_version >= 3.7\fP .UNINDENT .sp This means virtualenv works on the latest patch version of each of these minor versions. Previous patch versions are supported on a best effort approach. .sp CPython is shipped in multiple forms, and each OS repackages it, often applying some customization along the way. Therefore we cannot say universally that we support all platforms, but rather specify some we test against. In case of ones not specified here the support is unknown, though likely will work. If you find some cases please open a feature request on our issue tracker. .sp Note: .INDENT 0.0 .IP \(bu 2 as of \fB20.27.0\fP \-\- \fB2024\-10\-17\fP \-\- we no longer support running under Python \fB<=3.7\fP, .IP \(bu 2 as of \fB20.18.0\fP \-\- \fB2023\-02\-06\fP \-\- we no longer support running under Python \fB<=3.6\fP, .IP \(bu 2 as of \fB20.22.0\fP \-\- \fB2023\-04\-19\fP \-\- we no longer support creating environments for Python \fB<=3.6\fP\&. .UNINDENT .SS Linux .INDENT 0.0 .IP \(bu 2 installations from \X'tty: link https://www.python.org/downloads/'\fI\%python.org\fP\X'tty: link' .IP \(bu 2 Ubuntu 16.04+ (both upstream and \X'tty: link https://launchpad.net/~deadsnakes/+archive/ubuntu/ppa'\fI\%deadsnakes\fP\X'tty: link' builds) .IP \(bu 2 Fedora .IP \(bu 2 RHEL and CentOS .IP \(bu 2 OpenSuse .IP \(bu 2 Arch Linux .UNINDENT .SS macOS .sp In case of macOS we support: .INDENT 0.0 .IP \(bu 2 installations from \X'tty: link https://www.python.org/downloads/'\fI\%python.org\fP\X'tty: link', .IP \(bu 2 python versions installed via \X'tty: link https://docs.brew.sh/Homebrew-and-Python'\fI\%brew\fP\X'tty: link', .IP \(bu 2 Python 3 part of XCode (Python framework \- \fB/Library/Frameworks/Python3.framework/\fP). .UNINDENT .SS Windows .INDENT 0.0 .IP \(bu 2 Installations from \X'tty: link https://www.python.org/downloads/'\fI\%python.org\fP\X'tty: link' .IP \(bu 2 Windows Store Python \- note only \X'tty: link https://www.microsoft.com/en-us/p/python-38/9mssztt1n39l'\fI\%version 3.8+\fP\X'tty: link' .UNINDENT .SS User Guide .SS Quick start .INDENT 0.0 .TP .B Create the environment (creates a folder in your current directory) .INDENT 7.0 .INDENT 3.5 .sp .EX virtualenv env_name .EE .UNINDENT .UNINDENT .TP .B In Linux or Mac, activate the new python environment .INDENT 7.0 .INDENT 3.5 .sp .EX source env_name/bin/activate .EE .UNINDENT .UNINDENT .TP .B Or in Windows .INDENT 7.0 .INDENT 3.5 .sp .EX \&.\eenv_name\eScripts\eactivate .EE .UNINDENT .UNINDENT .TP .B Confirm that the env is successfully selected .INDENT 7.0 .INDENT 3.5 .sp .EX which python3 .EE .UNINDENT .UNINDENT .UNINDENT .SS Introduction .sp Virtualenv has one basic command: .INDENT 0.0 .INDENT 3.5 .sp .EX virtualenv venv .EE .UNINDENT .UNINDENT .sp This will create a python virtual environment of the same version as virtualenv, installed into the subdirectory \fBvenv\fP\&. The command line tool has quite a few of flags that modify the tool\(aqs behavior, for a full list make sure to check out \fI\%CLI flags\fP\&. .sp The tool works in two phases: .INDENT 0.0 .IP \(bu 2 \fBPhase 1\fP discovers a python interpreter to create a virtual environment from (by default this is the same python as the one \fBvirtualenv\fP is running from, however we can change this via the \fI\%p\fP option). .IP \(bu 2 \fBPhase 2\fP creates a virtual environment at the specified destination (\fI\%dest\fP), this can be broken down into four further sub\-steps: .INDENT 2.0 .IP \(bu 2 create a python that matches the target python interpreter from phase 1, .IP \(bu 2 install (bootstrap) seed packages (one or more of \X'tty: link https://pypi.org/project/pip'\fI\%pip\fP\X'tty: link', \X'tty: link https://pypi.org/project/setuptools'\fI\%setuptools\fP\X'tty: link', \X'tty: link https://pypi.org/project/wheel'\fI\%wheel\fP\X'tty: link') in the created virtual environment, .IP \(bu 2 install activation scripts into the binary directory of the virtual environment (these will allow end users to \fIactivate\fP the virtual environment from various shells). .IP \(bu 2 create files that mark the virtual environment as to be ignored by version control systems (currently we support Git only, as Mercurial, Bazaar or SVN do not support ignore files in subdirectories). This step can be skipped with the \fI\%no\-vcs\-ignore\fP option. .UNINDENT .UNINDENT .sp The python in your new virtualenv is effectively isolated from the python that was used to create it. .SS Python discovery .sp The first thing we need to be able to create a virtual environment is a python interpreter. This will describe to the tool what type of virtual environment you would like to create, think of it as: version, architecture, implementation. .sp \fBvirtualenv\fP being a python application has always at least one such available, the one \fBvirtualenv\fP itself is using, and as such this is the default discovered element. This means that if you install \fBvirtualenv\fP under python \fB3.8\fP, virtualenv will by default create virtual environments that are also of version \fB3.8\fP\&. .sp Created python virtual environments are usually not self\-contained. A complete python packaging is usually made up of thousands of files, so it\(aqs not efficient to install the entire python again into a new folder. Instead virtual environments are mere shells, that contain little within themselves, and borrow most from the system python (this is what you installed, when you installed python itself). This does mean that if you upgrade your system python your virtual environments \fImight\fP break, so watch out. The upside of this, referring to the system python, is that creating virtual environments can be fast. .sp Here we\(aqll describe the built\-in mechanism (note this can be extended though by plugins). The CLI flag \fI\%p\fP or \fI\%python\fP allows you to specify a python specifier for what type of virtual environment you would like, the format is either: .INDENT 0.0 .IP \(bu 2 a relative/absolute path to a Python interpreter, .IP \(bu 2 a specifier identifying the Python implementation, version, architecture in the following format: .INDENT 2.0 .INDENT 3.5 .INDENT 0.0 .INDENT 3.5 .sp .EX {python implementation name}{version}{architecture} .EE .UNINDENT .UNINDENT .sp We have the following restrictions: .INDENT 0.0 .IP \(bu 2 the python implementation is all alphabetic characters (\fBpython\fP means any implementation, and if is missing it defaults to \fBpython\fP), .IP \(bu 2 the version is a dot separated version number, .IP \(bu 2 the architecture is either \fB\-64\fP or \fB\-32\fP (missing means \fBany\fP). .UNINDENT .sp For example: .INDENT 0.0 .IP \(bu 2 \fBpython3.8.1\fP means any python implementation having the version \fB3.8.1\fP, .IP \(bu 2 \fB3\fP means any python implementation having the major version \fB3\fP, .IP \(bu 2 \fBcpython3\fP means a \fBCPython\fP implementation having the version \fB3\fP, .IP \(bu 2 \fBpypy2\fP means a python interpreter with the \fBPyPy\fP implementation and major version \fB2\fP\&. .UNINDENT .UNINDENT .UNINDENT .sp Given the specifier \fBvirtualenv\fP will apply the following strategy to discover/find the system executable: .INDENT 2.0 .INDENT 3.5 .INDENT 0.0 .IP \(bu 2 If we\(aqre on Windows look into the Windows registry, and check if we see any registered Python implementations that match the specification. This is in line with expectation laid out inside \X'tty: link https://www.python.org/dev/peps/pep-0514/'\fI\%PEP\-514\fP\X'tty: link' .IP \(bu 2 Try to discover a matching python executable within the folders enumerated on the \fBPATH\fP environment variable. In this case we\(aqll try to find an executable that has a name roughly similar to the specification (for exact logic, please see the implementation code). .UNINDENT .UNINDENT .UNINDENT .UNINDENT .sp \fBWARNING:\fP .INDENT 0.0 .INDENT 3.5 As detailed above, virtual environments usually just borrow things from the system Python, they don\(aqt actually contain all the data from the system Python. The version of the python executable is hardcoded within the python exe itself. Therefore, if you upgrade your system Python, your virtual environment will still report the version before the upgrade, even though now other than the executable all additional content (standard library, binary libs, etc) are of the new version. .sp Barring any major incompatibilities (rarely the case) the virtual environment will continue working, but other than the content embedded within the python executable it will behave like the upgraded version. If such a virtual environment python is specified as the target python interpreter, we will create virtual environments that match the new system Python version, not the version reported by the virtual environment. .UNINDENT .UNINDENT .SS Creators .sp These are what actually setup the virtual environment, usually as a reference against the system python. virtualenv at the moment has two types of virtual environments: .INDENT 0.0 .IP \(bu 2 \fBvenv\fP \- this delegates the creation process towards the \fBvenv\fP module, as described in \X'tty: link https://www.python.org/dev/peps/pep-0405'\fI\%PEP 405\fP\X'tty: link'\&. This is only available on Python interpreters having version \fB3.5\fP or later, and also has the downside that virtualenv \fBmust\fP create a process to invoke that module (unless virtualenv is installed in the system python), which can be an expensive operation (especially true on Windows). .IP \(bu 2 \fBbuiltin\fP \- this means \fBvirtualenv\fP is able to do the creation operation itself (by knowing exactly what files to create and what system files need to be referenced). The creator with name \fBbuiltin\fP is an alias on the first creator that\(aqs of this type (we provide creators for various target environments, that all differ in actual create operations, such as CPython 2 on Windows, PyPy2 on Windows, CPython3 on Posix, PyPy3 on Posix, and so on; for a full list see \fI\%creator\fP). .UNINDENT .SS Seeders .sp These will install for you some seed packages (one or more of: \X'tty: link https://pypi.org/project/pip'\fI\%pip\fP\X'tty: link', \X'tty: link https://pypi.org/project/setuptools'\fI\%setuptools\fP\X'tty: link', \X'tty: link https://pypi.org/project/wheel'\fI\%wheel\fP\X'tty: link') that enables you to install additional python packages into the created virtual environment (by invoking pip). Installing \X'tty: link https://pypi.org/project/setuptools'\fI\%setuptools\fP\X'tty: link' and \X'tty: link https://pypi.org/project/wheel'\fI\%wheel\fP\X'tty: link' is disabled by default on Python 3.12+ environments. There are two main seed mechanisms available: .INDENT 0.0 .IP \(bu 2 \fBpip\fP \- this method uses the bundled pip with virtualenv to install the seed packages (note, a new child process needs to be created to do this, which can be expensive especially on Windows). .IP \(bu 2 \fBapp\-data\fP \- this method uses the user application data directory to create install images. These images are needed to be created only once, and subsequent virtual environments can just link/copy those images into their pure python library path (the \fBsite\-packages\fP folder). This allows all but the first virtual environment creation to be blazing fast (a \fBpip\fP mechanism takes usually 98% of the virtualenv creation time, so by creating this install image that we can just link into the virtual environments install directory we can achieve speedups of shaving the initial 1 minute and 10 seconds down to just 8 seconds in case of a copy, or \fB0.8\fP seconds in case symlinks are available \- this is on Windows, Linux/macOS with symlinks this can be as low as \fB100ms\fP from 3+ seconds). To override the filesystem location of the seed cache, one can use the \fBVIRTUALENV_OVERRIDE_APP_DATA\fP environment variable. .UNINDENT .SS Wheels .sp To install a seed package via either \fBpip\fP or \fBapp\-data\fP method virtualenv needs to acquire a wheel of the target package. These wheels may be acquired from multiple locations as follows: .INDENT 0.0 .IP \(bu 2 \fBvirtualenv\fP ships out of box with a set of embed \fBwheels\fP for all three seed packages (\X'tty: link https://pypi.org/project/pip'\fI\%pip\fP\X'tty: link', \X'tty: link https://pypi.org/project/setuptools'\fI\%setuptools\fP\X'tty: link', \X'tty: link https://pypi.org/project/wheel'\fI\%wheel\fP\X'tty: link'). These are packaged together with the virtualenv source files, and only change upon upgrading virtualenv. Different Python versions require different versions of these, and because virtualenv supports a wide range of Python versions, the number of embedded wheels out of box is greater than 3. Whenever newer versions of these embedded packages are released upstream \fBvirtualenv\fP project upgrades them, and does a new release. Therefore, upgrading virtualenv periodically will also upgrade the version of the seed packages. .IP \(bu 2 However, end users might not be able to upgrade virtualenv at the same speed as we do new releases. Therefore, a user might request to upgrade the list of embedded wheels by invoking virtualenv with the \fI\%upgrade\-embed\-wheels\fP flag. If the operation is triggered in such a manual way subsequent runs of virtualenv will always use the upgraded embed wheels. .sp The operation can trigger automatically too, as a background process upon invocation of virtualenv, if no such upgrade has been performed in the last 14 days. It will only start using automatically upgraded wheel if they have been released for more than 28 days, and the automatic upgrade finished at least an hour ago: .INDENT 2.0 .IP \(bu 2 the 28 days period should guarantee end users are not pulling in automatically releases that have known bugs within, .IP \(bu 2 the one hour period after the automatic upgrade finished is implemented so that continuous integration services do not start using a new embedded versions half way through. .UNINDENT .sp The automatic behavior might be disabled via the \fI\%no\-periodic\-update\fP configuration flag/option. To acquire the release date of a package virtualenv will perform the following: .INDENT 2.0 .IP \(bu 2 lookup \fBhttps://pypi.org/pypi//json\fP (primary truth source), .IP \(bu 2 save the date the version was first discovered, and wait until 28 days passed. .UNINDENT .IP \(bu 2 Users can specify a set of local paths containing additional wheels by using the \fI\%extra\-search\-dir\fP command line argument flag. .UNINDENT .sp When searching for a wheel to use virtualenv performs lookup in the following order: .INDENT 0.0 .IP \(bu 2 embedded wheels, .IP \(bu 2 upgraded embedded wheels, .IP \(bu 2 extra search dir. .UNINDENT .sp Bundled wheels are all three above together. If neither of the locations contain the requested wheel version or \fI\%download\fP option is set will use \fBpip\fP download to load the latest version available from the index server. .SS Embed wheels for distributions .sp Custom distributions often want to use their own set of wheel versions to distribute instead of the one virtualenv releases on PyPi. The reason for this is trying to keep the system versions of those packages in sync with what virtualenv uses. In such cases they should patch the module \X'tty: link https://github.com/pypa/virtualenv/tree/main/src/virtualenv/seed/wheels/embed'\fI\%virtualenv.seed.wheels.embed\fP\X'tty: link', making sure to provide the function \fBget_embed_wheel\fP (which returns the wheel to use given a distribution/python version). The \fBBUNDLE_FOLDER\fP, \fBBUNDLE_SUPPORT\fP and \fBMAX\fP variables are needed if they want to use virtualenv\(aqs test suite to validate. .sp Furthermore, they might want to disable the periodic update by patching the \X'tty: link https://github.com/pypa/virtualenv/tree/main/src/virtualenv/seed/embed/base_embed.py'\fI\%virtualenv.seed.embed.base_embed.PERIODIC_UPDATE_ON_BY_DEFAULT\fP\X'tty: link' to \fBFalse\fP, and letting the system update mechanism to handle this. Note in this case the user might still request an upgrade of the embedded wheels by invoking virtualenv via \fI\%upgrade\-embed\-wheels\fP, but no longer happens automatically, and will not alter the OS provided wheels. .SS Activators .sp These are activation scripts that will mangle with your shell\(aqs settings to ensure that commands from within the python virtual environment take priority over your system paths. For example, if invoking \fBpip\fP from your shell returned the system python\(aqs pip before activation, once you do the activation this should refer to the virtual environments \fBpip\fP\&. Note, though that all we do is change priority; so, if your virtual environments \fBbin\fP/\fBScripts\fP folder does not contain some executable, this will still resolve to the same executable it would have resolved before the activation. .sp For a list of shells we provide activators see \fI\%activators\fP\&. The location of these is right alongside the Python executables: usually \fBScripts\fP folder on Windows, \fBbin\fP on POSIX. They are called \fBactivate\fP, plus an extension that\(aqs specific per activator, with no extension for Bash. You can invoke them, usually by source\-ing them. The source command might vary by shell \- e.g. on Bash it’s \fBsource\fP (or \fB\&.\fP): .INDENT 0.0 .INDENT 3.5 .sp .EX source venv/bin/activate .EE .UNINDENT .UNINDENT .sp The activate script prepends the virtual environment’s binary folder onto the \fBPATH\fP environment variable. It’s really just convenience for doing so, since you could do the same yourself. .sp Note that you don\(aqt have to activate a virtual environment to use it. You can instead use the full paths to its executables, rather than relying on your shell to resolve them to your virtual environment. .sp Activator scripts also modify your shell prompt to indicate which environment is currently active, by prepending the environment name (or the name specified by \fB\-\-prompt\fP when initially creating the environment) in brackets, like \fB(venv)\fP\&. You can disable this behavior by setting the environment variable \fBVIRTUAL_ENV_DISABLE_PROMPT\fP to any value. You can also get the environment name via the environment variable \fBVIRTUAL_ENV_PROMPT\fP if you want to customize your prompt, for example. .sp The scripts also provision a \fBdeactivate\fP command that will allow you to undo the operation: .INDENT 0.0 .INDENT 3.5 .sp .EX deactivate .EE .UNINDENT .UNINDENT .sp \fBNOTE:\fP .INDENT 0.0 .INDENT 3.5 If using Powershell, the \fBactivate\fP script is subject to the \X'tty: link http://technet.microsoft.com/en-us/library/dd347641.aspx'\fI\%execution policies\fP\X'tty: link' on the system. By default, Windows 7 and later, the system\(aqs execution policy is set to \fBRestricted\fP, meaning no scripts like the \fBactivate\fP script are allowed to be executed. .sp However, that can\(aqt stop us from changing that slightly to allow it to be executed. You may relax the system execution policy to allow running of local scripts without verifying the code signature using the following: .INDENT 0.0 .INDENT 3.5 .sp .EX Set\-ExecutionPolicy RemoteSigned .EE .UNINDENT .UNINDENT .sp Since the \fBactivate.ps1\fP script is generated locally for each virtualenv, it is not considered a remote script and can then be executed. .UNINDENT .UNINDENT .sp A longer explanation of this can be found within Allison Kaptur\(aqs 2013 blog post: \X'tty: link https://www.recurse.com/blog/14-there-is-no-magic-virtualenv-edition'\fI\%There\(aqs no magic: virtualenv edition\fP\X'tty: link' explains how virtualenv uses bash and Python and \fBPATH\fP and \fBPYTHONHOME\fP to isolate virtual environments\(aq paths. .SS Programmatic API .sp At the moment \fBvirtualenv\fP offers only CLI level interface. If you want to trigger invocation of Python environments from within Python you should be using the \fBvirtualenv.cli_run\fP method; this takes an \fBargs\fP argument where you can pass the options the same way you would from the command line. The run will return a session object containing data about the created virtual environment. .INDENT 0.0 .INDENT 3.5 .sp .EX from virtualenv import cli_run cli_run([\(dqvenv\(dq]) .EE .UNINDENT .UNINDENT .INDENT 0.0 .TP .B virtualenv.cli_run(args, options=None, setup_logging=True, env=None) Create a virtual environment given some command line interface arguments. .INDENT 7.0 .TP .B Parameters .INDENT 7.0 .IP \(bu 2 \fBargs\fP \-\- the command line arguments .IP \(bu 2 \fBoptions\fP \-\- passing in a \fBVirtualEnvOptions\fP object allows return of the parsed options .IP \(bu 2 \fBsetup_logging\fP \-\- \fBTrue\fP if setup logging handlers, \fBFalse\fP to use handlers already registered .IP \(bu 2 \fBenv\fP \-\- environment variables to use .UNINDENT .TP .B Returns the session object of the creation (its structure for now is experimental and might change on short notice) .UNINDENT .UNINDENT .INDENT 0.0 .TP .B virtualenv.session_via_cli(args, options=None, setup_logging=True, env=None) Create a virtualenv session (same as cli_run, but this does not perform the creation). Use this if you just want to query what the virtual environment would look like, but not actually create it. .INDENT 7.0 .TP .B Parameters .INDENT 7.0 .IP \(bu 2 \fBargs\fP \-\- the command line arguments .IP \(bu 2 \fBoptions\fP \-\- passing in a \fBVirtualEnvOptions\fP object allows return of the parsed options .IP \(bu 2 \fBsetup_logging\fP \-\- \fBTrue\fP if setup logging handlers, \fBFalse\fP to use handlers already registered .IP \(bu 2 \fBenv\fP \-\- environment variables to use .UNINDENT .TP .B Returns the session object of the creation (its structure for now is experimental and might change on short notice) .UNINDENT .UNINDENT .INDENT 0.0 .TP .B class virtualenv.run.session.Session(verbosity, app_data, interpreter, creator, seeder, activators) Represents a virtual environment creation session. .INDENT 7.0 .TP .B property verbosity The verbosity of the run. .UNINDENT .INDENT 7.0 .TP .B property interpreter Create a virtual environment based on this reference interpreter. .UNINDENT .INDENT 7.0 .TP .B property creator The creator used to build the virtual environment (must be compatible with the interpreter). .UNINDENT .INDENT 7.0 .TP .B property seeder The mechanism used to provide the seed packages (pip, setuptools, wheel). .UNINDENT .INDENT 7.0 .TP .B property activators Activators used to generate activations scripts. .UNINDENT .UNINDENT .SS CLI interface .SS CLI flags .sp \fBvirtualenv\fP is primarily a command line application. .sp It modifies the environment variables in a shell to create an isolated Python environment, so you\(aqll need to have a shell to run it. You can type in \fBvirtualenv\fP (name of the application) followed by flags that control its behavior. All options have sensible defaults, and there\(aqs one required argument: the name/path of the virtual environment to create. The default values for the command line options can be overridden via the \fI\%Configuration file\fP or \fI\%Environment Variables\fP\&. Environment variables takes priority over the configuration file values (\fB\-\-help\fP will show if a default comes from the environment variable as the help message will end in this case with environment variables or the configuration file). .sp The options that can be passed to virtualenv, along with their default values and a short description are listed below. .sp \fBvirtualenv [OPTIONS]\fP .TS box center; l|l|l. T{ \fBNamed Arguments\fP T} _ T{ T} T{ \fB\(aq==SUPPRESS==\(aq\fP T} T{ display the version of the virtualenv package and its location, then exit T} _ T{ T} T{ \fBFalse\fP T} T{ on failure also display the stacktrace internals of virtualenv T} _ T{ T} T{ \fBFalse\fP T} T{ use app data folder in read\-only mode (write operations will fail with error) T} _ T{ T} T{ platform specific application data folder T} T{ a data folder used as cache by the virtualenv T} _ T{ T} T{ \fBFalse\fP T} T{ start with empty app data folder T} _ T{ T} T{ \fBFalse\fP T} T{ trigger a manual update of the embedded wheels T} .TE .TS box center; l|l|l. T{ \fBverbosity\fP ⇒ verbosity = verbose \- quiet, default INFO, mapping => CRITICAL=0, ERROR=1, WARNING=2, INFO=3, DEBUG=4, NOTSET=5 T} _ T{ T} T{ \fB2\fP T} T{ increase verbosity T} _ T{ T} T{ \fB0\fP T} T{ decrease verbosity T} .TE .SS discovery .TS box center; l|l|l. T{ \fBcore\fP ⇒ options shared across all discovery T} _ T{ T} T{ \fB\(aqbuiltin\(aq\fP T} T{ interpreter discovery method; choice of: \fBbuiltin\fP T} _ T{ T} T{ the python executable virtualenv is installed into T} T{ interpreter based on what to create environment (path/identifier) \- by default use the interpreter where the tool is installed \- first found wins T} _ T{ T} T{ \fB[]\fP T} T{ try first these interpreters before starting the discovery T} .TE .SS creator .TS box center; l|l|l. T{ \fBcore\fP ⇒ options shared across all creator T} _ T{ T} T{ \fBbuiltin\fP if exist, else \fBvenv\fP T} T{ create environment via; choice of: \fBcpython3\-mac\-brew\fP, \fBcpython3\-mac\-framework\fP, \fBcpython3\-posix\fP, \fBcpython3\-win\fP, \fBpypy3\-posix\fP, \fBpypy3\-win\fP, \fBvenv\fP T} _ T{ T} T{ T} T{ directory to create virtualenv at T} _ T{ T} T{ \fBFalse\fP T} T{ remove the destination directory if exist before starting (will overwrite files otherwise) T} _ T{ T} T{ \fBFalse\fP T} T{ don\(aqt create VCS ignore directive in the destination directory T} _ T{ T} T{ \fBFalse\fP T} T{ give the virtual environment access to the system site\-packages dir T} _ T{ T} T{ \fBTrue\fP T} T{ try to use symlinks rather than copies, when symlinks are not the default for the platform T} _ T{ T} T{ \fBFalse\fP T} T{ try to use copies rather than symlinks, even when symlinks are the default for the platform T} .TE .SS seeder .TS box center; l|l|l. T{ \fBcore\fP ⇒ options shared across all seeder T} _ T{ T} T{ \fB\(aqapp\-data\(aq\fP T} T{ seed packages install method; choice of: \fBapp\-data\fP, \fBpip\fP T} _ T{ T} T{ \fBFalse\fP T} T{ do not install seed packages T} _ T{ T} T{ \fBTrue\fP T} T{ pass to disable download of the latest pip/setuptools/wheel from PyPI T} _ T{ T} T{ \fBFalse\fP T} T{ pass to enable download of the latest pip/setuptools/wheel from PyPI T} _ T{ T} T{ \fB[]\fP T} T{ a path containing wheels to extend the internal wheel list (can be set 1+ times) T} _ T{ T} T{ \fB\(aqbundle\(aq\fP T} T{ version of pip to install as seed: embed, bundle, none or exact version T} _ T{ T} T{ \fB\(aqnone\(aq\fP T} T{ version of setuptools to install as seed: embed, bundle, none or exact version T} _ T{ T} T{ \fB\(aqnone\(aq\fP T} T{ version of wheel to install as seed: embed, bundle, none or exact version T} _ T{ T} T{ \fBFalse\fP T} T{ do not install pip T} _ T{ T} T{ \fBFalse\fP T} T{ do not install setuptools T} _ T{ T} T{ \fBFalse\fP T} T{ do not install wheel T} _ T{ T} T{ \fBFalse\fP T} T{ disable the periodic (once every 14 days) update of the embedded wheels T} .TE .TS box center; l|l|l. T{ \fBapp\-data\fP ⇒ options specific to seeder app\-data T} _ T{ T} T{ \fBFalse\fP T} T{ symlink the python packages from the app\-data folder (requires seed pip>=19.3) T} .TE .SS activators .TS box center; l|l|l. T{ \fBcore\fP ⇒ options shared across all activators T} _ T{ T} T{ comma separated list of activators supported T} T{ activators to generate \- default is all supported; choice of: \fBbash\fP, \fBbatch\fP, \fBcshell\fP, \fBfish\fP, \fBnushell\fP, \fBpowershell\fP, \fBpython\fP, \fBxonsh\fP T} _ T{ T} T{ T} T{ provides an alternative prompt prefix for this environment (value of . means name of the current working directory) T} .TE .SS Defaults .SS Configuration file .sp Unless \fBVIRTUALENV_CONFIG_FILE\fP is set, virtualenv looks for a standard \fBvirtualenv.ini\fP configuration file. The exact location depends on the operating system you\(aqre using, as determined by \X'tty: link https://pypi.org/project/platformdirs'\fI\%platformdirs\fP\X'tty: link' application configuration definition. It can be overridden by setting the \fBVIRTUALENV_CONFIG_FILE\fP environment variable. The configuration file location is printed as at the end of the output when \fB\-\-help\fP is passed. .sp The keys of the settings are derived from the command line option (left strip the \fB\-\fP characters, and replace \fB\-\fP with \fB_\fP). Where multiple flags are available first found wins (where order is as it shows up under the \fB\-\-help\fP). .sp For example, \fI\%\-\-python\fP would be specified as: .INDENT 0.0 .INDENT 3.5 .sp .EX [virtualenv] python = /opt/python\-3.8/bin/python .EE .UNINDENT .UNINDENT .sp Options that take multiple values, like \fI\%extra\-search\-dir\fP can be specified as: .INDENT 0.0 .INDENT 3.5 .sp .EX [virtualenv] extra_search_dir = /path/to/dists /path/to/other/dists .EE .UNINDENT .UNINDENT .SS Environment Variables .sp Default values may be also specified via environment variables. The keys of the settings are derived from the command line option (left strip the \fB\-\fP characters, and replace \fB\-\fP with \fB_\fP, finally capitalize the name). Where multiple flags are available first found wins (where order is as it shows up under the \fB\-\-help\fP). .sp For example, to use a custom Python binary, instead of the one virtualenv is run with, you can set the environment variable \fBVIRTUALENV_PYTHON\fP like: .INDENT 0.0 .INDENT 3.5 .sp .EX env VIRTUALENV_PYTHON=/opt/python\-3.8/bin/python virtualenv .EE .UNINDENT .UNINDENT .sp Where the option accepts multiple values, for example for \fI\%python\fP or \fI\%extra\-search\-dir\fP, the values can be separated either by literal newlines or commas. Newlines and commas can not be mixed and if both are present only the newline is used for separating values. Examples for multiple values: .INDENT 0.0 .INDENT 3.5 .sp .EX env VIRTUALENV_PYTHON=/opt/python\-3.8/bin/python,python3.8 virtualenv env VIRTUALENV_EXTRA_SEARCH_DIR=/path/to/dists\en/path/to/other/dists virtualenv .EE .UNINDENT .UNINDENT .sp The equivalent CLI\-flags based invocation for the above examples would be: .INDENT 0.0 .INDENT 3.5 .sp .EX virtualenv \-\-python=/opt/python\-3.8/bin/python \-\-python=python3.8 virtualenv \-\-extra\-search\-dir=/path/to/dists \-\-extra\-search\-dir=/path/to/other/dists .EE .UNINDENT .UNINDENT .SS Extend functionality .sp \fBvirtualenv\fP allows one to extend the builtin functionality via a plugin system. To add a plugin you need to: .INDENT 0.0 .IP \(bu 2 write a python file containing the plugin code which follows our expected interface, .IP \(bu 2 package it as a python library, .IP \(bu 2 install it alongside the virtual environment. .UNINDENT .SS Python discovery .sp The python discovery mechanism is a component that needs to answer the following question: based on some type of user input give me a Python interpreter on the machine that matches that. The builtin interpreter tries to discover an installed Python interpreter (based on PEP\-515 and \fBPATH\fP discovery) on the users machine where the user input is a python specification. An alternative such discovery mechanism for example would be to use the popular \X'tty: link https://github.com/pyenv/pyenv'\fI\%pyenv\fP\X'tty: link' project to discover, and if not present install the requested Python interpreter. Python discovery mechanisms must be registered under key \fBvirtualenv.discovery\fP, and the plugin must implement \fI\%virtualenv.discovery.discover.Discover\fP: .INDENT 0.0 .INDENT 3.5 .sp .EX virtualenv.discovery = pyenv = virtualenv_pyenv.discovery:PyEnvDiscovery .EE .UNINDENT .UNINDENT .INDENT 0.0 .TP .B class virtualenv.discovery.discover.Discover(options) Discover and provide the requested Python interpreter. .sp Create a new discovery mechanism. .INDENT 7.0 .TP .B Parameters \fBoptions\fP \-\- the parsed options as defined within \fI\%add_parser_arguments()\fP .UNINDENT .INDENT 7.0 .TP .B classmethod add_parser_arguments(parser) Add CLI arguments for this discovery mechanisms. .INDENT 7.0 .TP .B Parameters \fBparser\fP \-\- the CLI parser .UNINDENT .UNINDENT .INDENT 7.0 .TP .B abstract run() Discovers an interpreter. .INDENT 7.0 .TP .B Returns the interpreter ready to use for virtual environment creation .UNINDENT .UNINDENT .INDENT 7.0 .TP .B property interpreter .INDENT 7.0 .TP .B Returns the interpreter as returned by \fI\%run()\fP, cached .UNINDENT .UNINDENT .UNINDENT .SS Creators .sp Creators are what actually perform the creation of a virtual environment. The builtin virtual environment creators all achieve this by referencing a global install; but would be just as valid for a creator to install a brand new entire python under the target path; or one could add additional creators that can create virtual environments for other python implementations, such as IronPython. They must be registered under and entry point with key \fBvirtualenv.create\fP , and the class must implement \fI\%virtualenv.create.creator.Creator\fP: .INDENT 0.0 .INDENT 3.5 .sp .EX virtualenv.create = cpython3\-posix = virtualenv.create.via_global_ref.builtin.cpython.cpython3:CPython3Posix .EE .UNINDENT .UNINDENT .INDENT 0.0 .TP .B class virtualenv.create.creator.Creator(options, interpreter) A class that given a python Interpreter creates a virtual environment. .sp Construct a new virtual environment creator. .INDENT 7.0 .TP .B Parameters .INDENT 7.0 .IP \(bu 2 \fBoptions\fP \-\- the CLI option as parsed from \fI\%add_parser_arguments()\fP .IP \(bu 2 \fBinterpreter\fP \-\- the interpreter to create virtual environment from .UNINDENT .UNINDENT .INDENT 7.0 .TP .B classmethod can_create(interpreter) Determine if we can create a virtual environment. .INDENT 7.0 .TP .B Parameters \fBinterpreter\fP \-\- the interpreter in question .TP .B Returns \fBNone\fP if we can\(aqt create, any other object otherwise that will be forwarded to \fI\%add_parser_arguments()\fP .UNINDENT .UNINDENT .INDENT 7.0 .TP .B classmethod add_parser_arguments(parser, interpreter, meta, app_data) Add CLI arguments for the creator. .INDENT 7.0 .TP .B Parameters .INDENT 7.0 .IP \(bu 2 \fBparser\fP \-\- the CLI parser .IP \(bu 2 \fBapp_data\fP \-\- the application data folder .IP \(bu 2 \fBinterpreter\fP \-\- the interpreter we\(aqre asked to create virtual environment for .IP \(bu 2 \fBmeta\fP \-\- value as returned by \fI\%can_create()\fP .UNINDENT .UNINDENT .UNINDENT .INDENT 7.0 .TP .B abstract create() Perform the virtual environment creation. .UNINDENT .INDENT 7.0 .TP .B setup_ignore_vcs() Generate ignore instructions for version control systems. .UNINDENT .UNINDENT .SS Seed mechanism .sp Seeders are what given a virtual environment will install somehow some seed packages into it. They must be registered under and entry point with key \fBvirtualenv.seed\fP , and the class must implement \fI\%virtualenv.seed.seeder.Seeder\fP: .INDENT 0.0 .INDENT 3.5 .sp .EX virtualenv.seed = db = virtualenv.seed.fromDb:InstallFromDb .EE .UNINDENT .UNINDENT .INDENT 0.0 .TP .B class virtualenv.seed.seeder.Seeder(options, enabled) A seeder will install some seed packages into a virtual environment. .sp Create. .INDENT 7.0 .TP .B Parameters .INDENT 7.0 .IP \(bu 2 \fBoptions\fP \-\- the parsed options as defined within \fI\%add_parser_arguments()\fP .IP \(bu 2 \fBenabled\fP \-\- a flag weather the seeder is enabled or not .UNINDENT .UNINDENT .INDENT 7.0 .TP .B classmethod add_parser_arguments(parser, interpreter, app_data) Add CLI arguments for this seed mechanisms. .INDENT 7.0 .TP .B Parameters .INDENT 7.0 .IP \(bu 2 \fBparser\fP \-\- the CLI parser .IP \(bu 2 \fBapp_data\fP \-\- the CLI parser .IP \(bu 2 \fBinterpreter\fP \-\- the interpreter this virtual environment is based of .UNINDENT .UNINDENT .UNINDENT .INDENT 7.0 .TP .B abstract run(creator) Perform the seed operation. .INDENT 7.0 .TP .B Parameters \fBcreator\fP \-\- the creator (based of \fI\%virtualenv.create.creator.Creator\fP) we used to create this virtual environment .UNINDENT .UNINDENT .UNINDENT .SS Activation scripts .sp If you want add an activator for a new shell you can do this by implementing a new activator. They must be registered under an entry point with key \fBvirtualenv.activate\fP , and the class must implement \fI\%virtualenv.activation.activator.Activator\fP: .INDENT 0.0 .INDENT 3.5 .sp .EX virtualenv.activate = bash = virtualenv.activation.bash:BashActivator .EE .UNINDENT .UNINDENT .INDENT 0.0 .TP .B class virtualenv.activation.activator.Activator(options) Generates activate script for the virtual environment. .sp Create a new activator generator. .INDENT 7.0 .TP .B Parameters \fBoptions\fP \-\- the parsed options as defined within \fI\%add_parser_arguments()\fP .UNINDENT .INDENT 7.0 .TP .B classmethod supports(interpreter) Check if the activation script is supported in the given interpreter. .INDENT 7.0 .TP .B Parameters \fBinterpreter\fP \-\- the interpreter we need to support .TP .B Returns \fBTrue\fP if supported, \fBFalse\fP otherwise .UNINDENT .UNINDENT .INDENT 7.0 .TP .B classmethod add_parser_arguments(parser, interpreter) Add CLI arguments for this activation script. .INDENT 7.0 .TP .B Parameters .INDENT 7.0 .IP \(bu 2 \fBparser\fP \-\- the CLI parser .IP \(bu 2 \fBinterpreter\fP \-\- the interpreter this virtual environment is based of .UNINDENT .UNINDENT .UNINDENT .INDENT 7.0 .TP .B abstract generate(creator) Generate activate script for the given creator. .INDENT 7.0 .TP .B Parameters \fBcreator\fP \-\- the creator (based of \fI\%virtualenv.create.creator.Creator\fP) we used to create this virtual environment .UNINDENT .UNINDENT .UNINDENT .SS Development .SS Getting started .sp \fBvirtualenv\fP is a volunteer maintained open source project and we welcome contributions of all forms. The sections below will help you get started with development, testing, and documentation. We’re pleased that you are interested in working on virtualenv. This document is meant to get you setup to work on virtualenv and to act as a guide and reference to the development setup. If you face any issues during this process, please \X'tty: link https://github.com/pypa/virtualenv/issues/new?title=Trouble+with+development+environment'\fI\%open an issue\fP\X'tty: link' about it on the issue tracker. .SS Setup .sp virtualenv is a command line application written in Python. To work on it, you\(aqll need: .INDENT 0.0 .IP \(bu 2 .INDENT 2.0 .TP \fBSource code\fP: available on \X'tty: link https://github.com/pypa/virtualenv'\fI\%GitHub\fP\X'tty: link'\&. You can use \fBgit\fP to clone the repository: .UNINDENT .INDENT 2.0 .INDENT 3.5 .sp .EX git clone https://github.com/pypa/virtualenv cd virtualenv .EE .UNINDENT .UNINDENT .IP \(bu 2 \fBPython interpreter\fP: We recommend using \fBCPython\fP\&. You can use \X'tty: link https://realpython.com/installing-python/'\fI\%this guide\fP\X'tty: link' to set it up. .IP \(bu 2 \X'tty: link https://pypi.org/project/tox'\fI\%tox\fP\X'tty: link': to automatically get the projects development dependencies and run the test suite. We recommend installing it using \X'tty: link https://pipxproject.github.io/pipx/'\fI\%pipx\fP\X'tty: link'\&. .UNINDENT .SS Running from source tree .sp The easiest way to do this is to generate the development tox environment, and then invoke virtualenv from under the \fB\&.tox/dev\fP folder .INDENT 0.0 .INDENT 3.5 .sp .EX tox \-e dev \&.tox/dev/bin/virtualenv # on Linux \&.tox/dev/Scripts/virtualenv # on Windows .EE .UNINDENT .UNINDENT .SS Running tests .sp virtualenv\(aqs tests are written using the \X'tty: link https://pypi.org/project/pytest'\fI\%pytest\fP\X'tty: link' test framework. \X'tty: link https://pypi.org/project/tox'\fI\%tox\fP\X'tty: link' is used to automate the setup and execution of virtualenv\(aqs tests. .sp To run tests locally execute: .INDENT 0.0 .INDENT 3.5 .sp .EX tox \-e py .EE .UNINDENT .UNINDENT .sp This will run the test suite for the same Python version as under which \fBtox\fP is installed. Alternatively you can specify a specific version of python by using the \fBpyNN\fP format, such as: \fBpy38\fP, \fBpypy3\fP, etc. .sp \fBtox\fP has been configured to forward any additional arguments it is given to \fBpytest\fP\&. This enables the use of pytest\(aqs \X'tty: link https://docs.pytest.org/en/latest/usage.html#specifying-tests-selecting-tests'\fI\%rich CLI\fP\X'tty: link'\&. As an example, you can select tests using the various ways that pytest provides: .INDENT 0.0 .INDENT 3.5 .sp .EX # Using markers tox \-e py \-\- \-m \(dqnot slow\(dq # Using keywords tox \-e py \-\- \-k \(dqtest_extra\(dq .EE .UNINDENT .UNINDENT .sp Some tests require additional dependencies to be run, such is the various shell activators (\fBbash\fP, \fBfish\fP, \fBpowershell\fP, etc). These tests will automatically be skipped if these are not present, note however that in CI all tests are run; so even if all tests succeed locally for you, they may still fail in the CI. .SS Running linters .sp virtualenv uses \X'tty: link https://pypi.org/project/pre-commit'\fI\%pre\-commit\fP\X'tty: link' for managing linting of the codebase. \fBpre\-commit\fP performs various checks on all files in virtualenv and uses tools that help follow a consistent code style within the codebase. To use linters locally, run: .INDENT 0.0 .INDENT 3.5 .sp .EX tox \-e fix .EE .UNINDENT .UNINDENT .sp \fBNOTE:\fP .INDENT 0.0 .INDENT 3.5 Avoid using \fB# noqa\fP comments to suppress linter warnings \- wherever possible, warnings should be fixed instead. \fB# noqa\fP comments are reserved for rare cases where the recommended style causes severe readability problems. .UNINDENT .UNINDENT .SS Building documentation .sp virtualenv\(aqs documentation is built using \X'tty: link https://pypi.org/project/Sphinx'\fI\%Sphinx\fP\X'tty: link'\&. The documentation is written in reStructuredText. To build it locally, run: .INDENT 0.0 .INDENT 3.5 .sp .EX tox \-e docs .EE .UNINDENT .UNINDENT .sp The built documentation can be found in the \fB\&.tox/docs_out\fP folder and may be viewed by opening \fBindex.html\fP within that folder. .SS Release .sp virtualenv\(aqs release schedule is tied to \fBpip\fP, \fBsetuptools\fP and \fBwheel\fP\&. We bundle the latest version of these libraries so each time there\(aqs a new version of any of these, there will be a new virtualenv release shortly afterwards (we usually wait just a few days to avoid pulling in any broken releases). .SS Contributing .SS Submitting pull requests .sp Submit pull requests against the \fBmain\fP branch, providing a good description of what you\(aqre doing and why. You must have legal permission to distribute any code you contribute to virtualenv and it must be available under the MIT License. Provide tests that cover your changes and run the tests locally first. virtualenv \fI\%supports\fP multiple Python versions and operating systems. Any pull request must consider and work on all these platforms. .sp Pull Requests should be small to facilitate review. Keep them self\-contained, and limited in scope. \X'tty: link https://www.kessler.de/prd/smartbear/BestPracticesForPeerCodeReview.pdf'\fI\%Studies have shown\fP\X'tty: link' that review quality falls off as patch size grows. Sometimes this will result in many small PRs to land a single large feature. In particular, pull requests must not be treated as \(dqfeature branches\(dq, with ongoing development work happening within the PR. Instead, the feature should be broken up into smaller, independent parts which can be reviewed and merged individually. .sp Additionally, avoid including \(dqcosmetic\(dq changes to code that is unrelated to your change, as these make reviewing the PR more difficult. Examples include re\-flowing text in comments or documentation, or addition or removal of blank lines or whitespace within lines. Such changes can be made separately, as a \(dqformatting cleanup\(dq PR, if needed. .SS Automated testing .sp All pull requests and merges to \(aqmain\(aq branch are tested using \X'tty: link https://azure.microsoft.com/en-gb/services/devops/pipelines/'\fI\%Azure Pipelines\fP\X'tty: link' (configured by \fBazure\-pipelines.yml\fP file at the root of the repository). You can find the status and results to the CI runs for your PR on GitHub\(aqs Web UI for the pull request. You can also find links to the CI services\(aq pages for the specific builds in the form of \(dqDetails\(dq links, in case the CI run fails and you wish to view the output. .sp To trigger CI to run again for a pull request, you can close and open the pull request or submit another change to the pull request. If needed, project maintainers can manually trigger a restart of a job/build. .SS NEWS entries .sp The \fBchangelog.rst\fP file is managed using \X'tty: link https://pypi.org/project/towncrier'\fI\%towncrier\fP\X'tty: link' and all non trivial changes must be accompanied by a news entry. To add an entry to the news file, first you need to have created an issue describing the change you want to make. A Pull Request itself \fImay\fP function as such, but it is preferred to have a dedicated issue (for example, in case the PR ends up rejected due to code quality reasons). .sp Once you have an issue or pull request, you take the number and you create a file inside of the \fBdocs/changelog\fP directory named after that issue number with an extension of: .INDENT 0.0 .IP \(bu 2 \fBfeature.rst\fP, .IP \(bu 2 \fBbugfix.rst\fP, .IP \(bu 2 \fBdoc.rst\fP, .IP \(bu 2 \fBremoval.rst\fP, .IP \(bu 2 \fBmisc.rst\fP\&. .UNINDENT .sp Thus if your issue or PR number is \fB1234\fP and this change is fixing a bug, then you would create a file \fBdocs/changelog/1234.bugfix.rst\fP\&. PRs can span multiple categories by creating multiple files (for instance, if you added a feature and deprecated/removed the old feature at the same time, you would create \fBdocs/changelog/1234.bugfix.rst\fP and \fBdocs/changelog/1234.remove.rst\fP). Likewise if a PR touches multiple issues/PRs you may create a file for each of them with the same contents and \X'tty: link https://pypi.org/project/towncrier'\fI\%towncrier\fP\X'tty: link' will deduplicate them. .SS Contents of a NEWS entry .sp The contents of this file are reStructuredText formatted text that will be used as the content of the news file entry. You do not need to reference the issue or PR numbers here as towncrier will automatically add a reference to all of the affected issues when rendering the news file. .sp In order to maintain a consistent style in the \fBchangelog.rst\fP file, it is preferred to keep the news entry to the point, in sentence case, shorter than 120 characters and in an imperative tone \-\- an entry should complete the sentence \fBThis change will …\fP\&. In rare cases, where one line is not enough, use a summary line in an imperative tone followed by a blank line separating it from a description of the feature/change in one or more paragraphs, each wrapped at 120 characters. Remember that a news entry is meant for end users and should only contain details relevant to an end user. .SS Choosing the type of NEWS entry .sp A trivial change is anything that does not warrant an entry in the news file. Some examples are: code refactors that don\(aqt change anything as far as the public is concerned, typo fixes, white space modification, etc. To mark a PR as trivial a contributor simply needs to add a randomly named, empty file to the \fBnews/\fP directory with the extension of \fB\&.trivial\fP\&. .SS Becoming a maintainer .sp If you want to become an official maintainer, start by helping out. As a first step, we welcome you to triage issues on virtualenv\(aqs issue tracker. virtualenv maintainers provide triage abilities to contributors once they have been around for some time and contributed positively to the project. This is optional and highly recommended for becoming a virtualenv maintainer. Later, when you think you\(aqre ready, get in touch with one of the maintainers and they will initiate a vote among the existing maintainers. .sp \fBNOTE:\fP .INDENT 0.0 .INDENT 3.5 Upon becoming a maintainer, a person should be given access to various virtualenv\-related tooling across multiple platforms. These are noted here for future reference by the maintainers: .INDENT 0.0 .IP \(bu 2 GitHub Push Access .IP \(bu 2 PyPI Publishing Access .IP \(bu 2 CI Administration capabilities .IP \(bu 2 ReadTheDocs Administration capabilities .UNINDENT .UNINDENT .UNINDENT .SS Release History .SS v20.27.1 (2024\-10\-28) .SS Bugfixes \- 20.27.1 .INDENT 0.0 .IP \(bu 2 Upgrade embedded wheels: .INDENT 2.0 .IP \(bu 2 pip to \fB24.3.1\fP from \fB24.2\fP (\X'tty: link https://github.com/pypa/virtualenv/issues/2789'\fI\%#2789\fP\X'tty: link') .UNINDENT .UNINDENT .SS v20.27.0 (2024\-10\-17) .SS Features \- 20.27.0 .INDENT 0.0 .IP \(bu 2 Drop 3.7 support as the CI environments no longer allow it running \- by \X'tty: link https://github.com/gaborbernat'\fI\%@gaborbernat\fP\X'tty: link'\&. (\X'tty: link https://github.com/pypa/virtualenv/issues/2758'\fI\%#2758\fP\X'tty: link') .UNINDENT .SS Bugfixes \- 20.27.0 .INDENT 0.0 .IP \(bu 2 When a \fB$PATH\fP entry cannot be checked for existence, skip it instead of terminating \- by \X'tty: link https://github.com/hroncok'\fI\%@hroncok\fP\X'tty: link'\&. (\X'tty: link https://github.com/pypa/virtualenv/issues/2782'\fI\%#2782\fP\X'tty: link') .IP \(bu 2 Upgrade embedded wheels: .INDENT 2.0 .IP \(bu 2 setuptools to \fB75.2.0\fP from \fB75.1.0\fP .IP \(bu 2 Removed pip of \fB24.0\fP .IP \(bu 2 Removed setuptools of \fB68.0.0\fP .IP \(bu 2 Removed wheel of \fB0.42.0\fP .UNINDENT .INDENT 2.0 .IP \(bu 2 by \X'tty: link https://github.com/gaborbernat'\fI\%@gaborbernat\fP\X'tty: link'\&. (\X'tty: link https://github.com/pypa/virtualenv/issues/2783'\fI\%#2783\fP\X'tty: link') .UNINDENT .IP \(bu 2 Fix zipapp is broken on Windows post distlib \fB0.3.9\fP \- by \X'tty: link https://github.com/gaborbernat'\fI\%@gaborbernat\fP\X'tty: link'\&. (\X'tty: link https://github.com/pypa/virtualenv/issues/2784'\fI\%#2784\fP\X'tty: link') .UNINDENT .SS v20.26.6 (2024\-09\-27) .SS Bugfixes \- 20.26.6 .INDENT 0.0 .IP \(bu 2 Properly quote string placeholders in activation script templates to mitigate potential command injection \- by \X'tty: link https://github.com/y5c4l3'\fI\%@y5c4l3\fP\X'tty: link'\&. (\X'tty: link https://github.com/pypa/virtualenv/issues/2768'\fI\%#2768\fP\X'tty: link') .UNINDENT .SS v20.26.5 (2024\-09\-17) .SS Bugfixes \- 20.26.5 .INDENT 0.0 .IP \(bu 2 Upgrade embedded wheels: setuptools to \fB75.1.0\fP from \fB74.1.2\fP \- by \X'tty: link https://github.com/gaborbernat'\fI\%@gaborbernat\fP\X'tty: link'\&. (\X'tty: link https://github.com/pypa/virtualenv/issues/2765'\fI\%#2765\fP\X'tty: link') .UNINDENT .SS v20.26.4 (2024\-09\-07) .SS Bugfixes \- 20.26.4 .INDENT 0.0 .IP \(bu 2 no longer create \fI()\fP output in console during activation of a virtualenv by .bat file. (\X'tty: link https://github.com/pypa/virtualenv/issues/2728'\fI\%#2728\fP\X'tty: link') .IP \(bu 2 Upgrade embedded wheels: .INDENT 2.0 .IP \(bu 2 wheel to \fB0.44.0\fP from \fB0.43.0\fP .IP \(bu 2 pip to \fB24.2\fP from \fB24.1\fP .IP \(bu 2 setuptools to \fB74.1.2\fP from \fB70.1.0\fP (\X'tty: link https://github.com/pypa/virtualenv/issues/2760'\fI\%#2760\fP\X'tty: link') .UNINDENT .UNINDENT .SS v20.26.3 (2024\-06\-21) .SS Bugfixes \- 20.26.3 .INDENT 0.0 .IP \(bu 2 Upgrade embedded wheels: .INDENT 2.0 .IP \(bu 2 setuptools to \fB70.1.0\fP from \fB69.5.1\fP .IP \(bu 2 pip to \fB24.1\fP from \fB24.0\fP (\X'tty: link https://github.com/pypa/virtualenv/issues/2741'\fI\%#2741\fP\X'tty: link') .UNINDENT .UNINDENT .SS v20.26.2 (2024\-05\-13) .SS Bugfixes \- 20.26.2 .INDENT 0.0 .IP \(bu 2 \fBvirtualenv.pyz\fP no longer fails when zipapp path contains a symlink \- by \X'tty: link https://github.com/HandSonic'\fI\%@HandSonic\fP\X'tty: link' and \X'tty: link https://github.com/petamas'\fI\%@petamas\fP\X'tty: link'\&. (\X'tty: link https://github.com/pypa/virtualenv/issues/1949'\fI\%#1949\fP\X'tty: link') .IP \(bu 2 Fix bad return code from activate.sh if hashing is disabled \- by :user:\(aqfenkes\-ibm\(aq. (\X'tty: link https://github.com/pypa/virtualenv/issues/2717'\fI\%#2717\fP\X'tty: link') .UNINDENT .SS v20.26.1 (2024\-04\-29) .SS Bugfixes \- 20.26.1 .INDENT 0.0 .IP \(bu 2 fix PATH\-based Python discovery on Windows \- by \X'tty: link https://github.com/ofek'\fI\%@ofek\fP\X'tty: link'\&. (\X'tty: link https://github.com/pypa/virtualenv/issues/2712'\fI\%#2712\fP\X'tty: link') .UNINDENT .SS v20.26.0 (2024\-04\-23) .SS Bugfixes \- 20.26.0 .INDENT 0.0 .IP \(bu 2 allow builtin discovery to discover specific interpreters (e.g. \fBpython3.12\fP) given an unspecific spec (e.g. \fBpython3\fP) \- by \X'tty: link https://github.com/flying-sheep'\fI\%@flying\-sheep\fP\X'tty: link'\&. (\X'tty: link https://github.com/pypa/virtualenv/issues/2709'\fI\%#2709\fP\X'tty: link') .UNINDENT .SS v20.25.3 (2024\-04\-17) .SS Bugfixes \- 20.25.3 .INDENT 0.0 .IP \(bu 2 Python 3.13.0a6 renamed pathmod to parser. (\X'tty: link https://github.com/pypa/virtualenv/issues/2702'\fI\%#2702\fP\X'tty: link') .UNINDENT .SS v20.25.2 (2024\-04\-16) .SS Bugfixes \- 20.25.2 .INDENT 0.0 .IP \(bu 2 Upgrade embedded wheels: .INDENT 2.0 .IP \(bu 2 setuptools of \fB69.1.0\fP to \fB69.5.1\fP .IP \(bu 2 wheel of \fB0.42.0\fP to \fB0.43.0\fP (\X'tty: link https://github.com/pypa/virtualenv/issues/2699'\fI\%#2699\fP\X'tty: link') .UNINDENT .UNINDENT .SS v20.25.1 (2024\-02\-21) .SS Bugfixes \- 20.25.1 .INDENT 0.0 .IP \(bu 2 Upgrade embedded wheels: .INDENT 2.0 .IP \(bu 2 setuptools to \fB69.0.3\fP from \fB69.0.2\fP .IP \(bu 2 pip to \fB23.3.2\fP from \fB23.3.1\fP (\X'tty: link https://github.com/pypa/virtualenv/issues/2681'\fI\%#2681\fP\X'tty: link') .UNINDENT .IP \(bu 2 Upgrade embedded wheels: .INDENT 2.0 .IP \(bu 2 pip \fB23.3.2\fP to \fB24.0\fP, .IP \(bu 2 setuptools \fB69.0.3\fP to \fB69.1.0\fP\&. (\X'tty: link https://github.com/pypa/virtualenv/issues/2691'\fI\%#2691\fP\X'tty: link') .UNINDENT .UNINDENT .SS Misc \- 20.25.1 .INDENT 0.0 .IP \(bu 2 \X'tty: link https://github.com/pypa/virtualenv/issues/2688'\fI\%#2688\fP\X'tty: link' .UNINDENT .SS v20.25.0 (2023\-12\-01) .SS Features \- 20.25.0 .INDENT 0.0 .IP \(bu 2 The tests now pass on the CI with Python 3.13.0a2 \- by \X'tty: link https://github.com/hroncok'\fI\%@hroncok\fP\X'tty: link'\&. (\X'tty: link https://github.com/pypa/virtualenv/issues/2673'\fI\%#2673\fP\X'tty: link') .UNINDENT .SS Bugfixes \- 20.25.0 .INDENT 0.0 .IP \(bu 2 Upgrade embedded wheels: .INDENT 2.0 .IP \(bu 2 wheel to \fB0.41.3\fP from \fB0.41.2\fP (\X'tty: link https://github.com/pypa/virtualenv/issues/2665'\fI\%#2665\fP\X'tty: link') .UNINDENT .IP \(bu 2 Upgrade embedded wheels: .INDENT 2.0 .IP \(bu 2 wheel to \fB0.42.0\fP from \fB0.41.3\fP .IP \(bu 2 setuptools to \fB69.0.2\fP from \fB68.2.2\fP (\X'tty: link https://github.com/pypa/virtualenv/issues/2669'\fI\%#2669\fP\X'tty: link') .UNINDENT .UNINDENT .SS v20.24.6 (2023\-10\-23) .SS Bugfixes \- 20.24.6 .INDENT 0.0 .IP \(bu 2 Use get_hookimpls method instead of the private attribute in tests. (\X'tty: link https://github.com/pypa/virtualenv/issues/2649'\fI\%#2649\fP\X'tty: link') .IP \(bu 2 Upgrade embedded wheels: .INDENT 2.0 .IP \(bu 2 setuptools to \fB68.2.2\fP from \fB68.2.0\fP .IP \(bu 2 pip to \fB23.3.1\fP from \fB23.2.1\fP (\X'tty: link https://github.com/pypa/virtualenv/issues/2656'\fI\%#2656\fP\X'tty: link') .UNINDENT .UNINDENT .SS v20.24.5 (2023\-09\-08) .SS Bugfixes \- 20.24.5 .INDENT 0.0 .IP \(bu 2 Declare PyPy 3.10 support \- by \X'tty: link https://github.com/cclauss'\fI\%@cclauss\fP\X'tty: link'\&. (\X'tty: link https://github.com/pypa/virtualenv/issues/2638'\fI\%#2638\fP\X'tty: link') .IP \(bu 2 Brew on macOS no longer allows copy builds \- disallow choosing this by \X'tty: link https://github.com/gaborbernat'\fI\%@gaborbernat\fP\X'tty: link'\&. (\X'tty: link https://github.com/pypa/virtualenv/issues/2640'\fI\%#2640\fP\X'tty: link') .IP \(bu 2 Upgrade embedded wheels: .INDENT 2.0 .IP \(bu 2 setuptools to \fB68.2.0\fP from \fB68.1.2\fP (\X'tty: link https://github.com/pypa/virtualenv/issues/2642'\fI\%#2642\fP\X'tty: link') .UNINDENT .UNINDENT .SS v20.24.4 (2023\-08\-30) .SS Bugfixes \- 20.24.4 .INDENT 0.0 .IP \(bu 2 Upgrade embedded wheels: .INDENT 2.0 .IP \(bu 2 setuptools to \fB68.1.2\fP from \fB68.1.0\fP on \fB3.8+\fP .IP \(bu 2 wheel to \fB0.41.2\fP from \fB0.41.1\fP on \fB3.7+\fP (\X'tty: link https://github.com/pypa/virtualenv/issues/2628'\fI\%#2628\fP\X'tty: link') .UNINDENT .UNINDENT .SS v20.24.3 (2023\-08\-11) .SS Bugfixes \- 20.24.3 .INDENT 0.0 .IP \(bu 2 Fixed ResourceWarning on exit caused by periodic update subprocess (\X'tty: link https://github.com/pypa/virtualenv/issues/2472'\fI\%#2472\fP\X'tty: link') .IP \(bu 2 Upgrade embedded wheels: .INDENT 2.0 .IP \(bu 2 wheel to \fB0.41.1\fP from \fB0.41.0\fP (\X'tty: link https://github.com/pypa/virtualenv/issues/2622'\fI\%#2622\fP\X'tty: link') .UNINDENT .UNINDENT .SS Misc \- 20.24.3 .INDENT 0.0 .IP \(bu 2 \X'tty: link https://github.com/pypa/virtualenv/issues/2610'\fI\%#2610\fP\X'tty: link' .UNINDENT .SS v20.24.2 (2023\-07\-24) .SS Bugfixes \- 20.24.2 .INDENT 0.0 .IP \(bu 2 Upgrade embedded wheels: .INDENT 2.0 .IP \(bu 2 pip to \fB23.2.1\fP from \fB23.2\fP .IP \(bu 2 wheel to \fB0.41.0\fP from \fB0.40.0\fP (\X'tty: link https://github.com/pypa/virtualenv/issues/2614'\fI\%#2614\fP\X'tty: link') .UNINDENT .UNINDENT .SS v20.24.1 (2023\-07\-19) .SS Bugfixes \- 20.24.1 .INDENT 0.0 .IP \(bu 2 Upgrade embedded wheels: .INDENT 2.0 .IP \(bu 2 pip to \fB23.2\fP from \fB23.1.2\fP \- by \X'tty: link https://github.com/arielkirkwood'\fI\%@arielkirkwood\fP\X'tty: link' (\X'tty: link https://github.com/pypa/virtualenv/issues/2611'\fI\%#2611\fP\X'tty: link') .UNINDENT .UNINDENT .SS v20.24.0 (2023\-07\-14) .SS Features \- 20.24.0 .INDENT 0.0 .IP \(bu 2 Export the prompt prefix as \fBVIRTUAL_ENV_PROMPT\fP when activating a virtual environment \- by \X'tty: link https://github.com/jimporter'\fI\%@jimporter\fP\X'tty: link'\&. (\X'tty: link https://github.com/pypa/virtualenv/issues/2194'\fI\%#2194\fP\X'tty: link') .UNINDENT .SS Bugfixes \- 20.24.0 .INDENT 0.0 .IP \(bu 2 Fix test suite \- by \X'tty: link https://github.com/gaborbernat'\fI\%@gaborbernat\fP\X'tty: link'\&. (\X'tty: link https://github.com/pypa/virtualenv/issues/2592'\fI\%#2592\fP\X'tty: link') .IP \(bu 2 Upgrade embedded wheels: .INDENT 2.0 .IP \(bu 2 setuptools to \fB68.0.0\fP from \fB67.8.0\fP (\X'tty: link https://github.com/pypa/virtualenv/issues/2607'\fI\%#2607\fP\X'tty: link') .UNINDENT .UNINDENT .SS v20.23.1 (2023\-06\-16) .SS Bugfixes \- 20.23.1 .INDENT 0.0 .IP \(bu 2 update and simplify nushell activation script, fixes an issue on Windows resulting in consecutive command not found \- by \X'tty: link https://github.com/melMass'\fI\%@melMass\fP\X'tty: link'\&. (\X'tty: link https://github.com/pypa/virtualenv/issues/2572'\fI\%#2572\fP\X'tty: link') .IP \(bu 2 Upgrade embedded wheels: .INDENT 2.0 .IP \(bu 2 setuptools to \fB67.8.0\fP from \fB67.7.2\fP (\X'tty: link https://github.com/pypa/virtualenv/issues/2588'\fI\%#2588\fP\X'tty: link') .UNINDENT .UNINDENT .SS v20.23.0 (2023\-04\-27) .SS Features \- 20.23.0 .INDENT 0.0 .IP \(bu 2 Do not install \fBwheel\fP and \fBsetuptools\fP seed packages for Python 3.12+. To restore the old behavior use: .INDENT 2.0 .IP \(bu 2 for \fBwheel\fP use \fBVIRTUALENV_WHEEL=bundle\fP environment variable or \fB\-\-wheel=bundle\fP CLI flag, .IP \(bu 2 for \fBsetuptools\fP use \fBVIRTUALENV_SETUPTOOLS=bundle\fP environment variable or \fB\-\-setuptools=bundle\fP CLI flag. .UNINDENT .sp By \X'tty: link https://github.com/chrysle'\fI\%@chrysle\fP\X'tty: link'\&. (\X'tty: link https://github.com/pypa/virtualenv/issues/2487'\fI\%#2487\fP\X'tty: link') .IP \(bu 2 3.12 support \- by \X'tty: link https://github.com/gaborbernat'\fI\%@gaborbernat\fP\X'tty: link'\&. (\X'tty: link https://github.com/pypa/virtualenv/issues/2558'\fI\%#2558\fP\X'tty: link') .UNINDENT .SS Bugfixes \- 20.23.0 .INDENT 0.0 .IP \(bu 2 Prevent \fBPermissionError\fP when using venv creator on systems that deliver files without user write permission \- by \X'tty: link https://github.com/kulikjak'\fI\%@kulikjak\fP\X'tty: link'\&. (\X'tty: link https://github.com/pypa/virtualenv/issues/2543'\fI\%#2543\fP\X'tty: link') .IP \(bu 2 Upgrade setuptools to \fB67.7.2\fP from \fB67.6.1\fP and pip to \fB23.1.2\fP from \fB23.1\fP \- by \X'tty: link https://github.com/szleb'\fI\%@szleb\fP\X'tty: link'\&. (\X'tty: link https://github.com/pypa/virtualenv/issues/2560'\fI\%#2560\fP\X'tty: link') .UNINDENT .SS v20.22.0 (2023\-04\-19) .SS Features \- 20.22.0 .INDENT 0.0 .IP \(bu 2 Drop support for creating Python <=3.6 (including 2) interpreters. Removed pip of \fB20.3.4\fP, \fB21.3.1\fP; wheel of \fB0.37.1\fP; setuptools of \fB59.6.0\fP, \fB44.1.1\fP, \fB50.3.2\fP\- by \X'tty: link https://github.com/gaborbernat'\fI\%@gaborbernat\fP\X'tty: link'\&. (\X'tty: link https://github.com/pypa/virtualenv/issues/2548'\fI\%#2548\fP\X'tty: link') .UNINDENT .SS v20.21.1 (2023\-04\-19) .SS Bugfixes \- 20.21.1 .INDENT 0.0 .IP \(bu 2 Add \fBtox.ini\fP to sdist \- by \X'tty: link https://github.com/mtelka'\fI\%@mtelka\fP\X'tty: link'\&. (\X'tty: link https://github.com/pypa/virtualenv/issues/2511'\fI\%#2511\fP\X'tty: link') .IP \(bu 2 Move the use of \(aqlet\(aq in nushell to ensure compatibility with future releases of nushell, where \(aqlet\(aq no longer assumes that its initializer is a full expressions. (\X'tty: link https://github.com/pypa/virtualenv/issues/2527'\fI\%#2527\fP\X'tty: link') .IP \(bu 2 The nushell command \(aqstr collect\(aq has been superseded by the \(aqstr join\(aq command. The activate.nu script has been updated to reflect this change. (\X'tty: link https://github.com/pypa/virtualenv/issues/2532'\fI\%#2532\fP\X'tty: link') .IP \(bu 2 Upgrade embedded wheels: .INDENT 2.0 .IP \(bu 2 wheel to \fB0.40.0\fP from \fB0.38.4\fP .IP \(bu 2 setuptools to \fB67.6.1\fP from \fB67.4.0\fP .IP \(bu 2 pip to \fB23.1\fP from \fB23.0.1\fP (\X'tty: link https://github.com/pypa/virtualenv/issues/2546'\fI\%#2546\fP\X'tty: link') .UNINDENT .UNINDENT .SS v20.21.0 (2023\-03\-12) .SS Features \- 20.21.0 .INDENT 0.0 .IP \(bu 2 Make closure syntax explicitly starts with {||. (\X'tty: link https://github.com/pypa/virtualenv/issues/2512'\fI\%#2512\fP\X'tty: link') .UNINDENT .SS Bugfixes \- 20.21.0 .INDENT 0.0 .IP \(bu 2 Add \fBprint\fP command to nushell print_prompt to ensure compatibility with future release of nushell, where intermediate commands no longer print their result to stdout. (\X'tty: link https://github.com/pypa/virtualenv/issues/2514'\fI\%#2514\fP\X'tty: link') .IP \(bu 2 Do not assume the default encoding. (\X'tty: link https://github.com/pypa/virtualenv/issues/2515'\fI\%#2515\fP\X'tty: link') .IP \(bu 2 Make \fBReentrantFileLock\fP thread\-safe and, thereby, fix race condition in \fBvirtualenv.cli_run\fP \- by \X'tty: link https://github.com/radoering'\fI\%@radoering\fP\X'tty: link'\&. (\X'tty: link https://github.com/pypa/virtualenv/issues/2516'\fI\%#2516\fP\X'tty: link') .UNINDENT .SS v20.20.0 (2023\-02\-28) .SS Features \- 20.20.0 .INDENT 0.0 .IP \(bu 2 Change environment variable existence check in Nushell activation script to not use deprecated command. (\X'tty: link https://github.com/pypa/virtualenv/issues/2506'\fI\%#2506\fP\X'tty: link') .UNINDENT .SS Bugfixes \- 20.20.0 .INDENT 0.0 .IP \(bu 2 Discover CPython implementations distributed on Windows by any organization \- by \X'tty: link https://github.com/faph'\fI\%@faph\fP\X'tty: link'\&. (\X'tty: link https://github.com/pypa/virtualenv/issues/2504'\fI\%#2504\fP\X'tty: link') .IP \(bu 2 Upgrade embedded setuptools to \fB67.4.0\fP from \fB67.1.0\fP and pip to \fB23.0.1\fP from \fB23.0\fP \- by \X'tty: link https://github.com/gaborbernat'\fI\%@gaborbernat\fP\X'tty: link'\&. (\X'tty: link https://github.com/pypa/virtualenv/issues/2510'\fI\%#2510\fP\X'tty: link') .UNINDENT .SS v20.19.0 (2023\-02\-07) .SS Features \- 20.19.0 .INDENT 0.0 .IP \(bu 2 Allow platformdirs version \fB3\fP \- by \X'tty: link https://github.com/cdce8p'\fI\%@cdce8p\fP\X'tty: link'\&. (\X'tty: link https://github.com/pypa/virtualenv/issues/2499'\fI\%#2499\fP\X'tty: link') .UNINDENT .SS v20.18.0 (2023\-02\-06) .SS Features \- 20.18.0 .INDENT 0.0 .IP \(bu 2 Drop \fB3.6\fP runtime support (can still create \fB2.7+\fP) \- by \X'tty: link https://github.com/gaborbernat'\fI\%@gaborbernat\fP\X'tty: link'\&. (\X'tty: link https://github.com/pypa/virtualenv/issues/2489'\fI\%#2489\fP\X'tty: link') .UNINDENT .SS Bugfixes \- 20.18.0 .INDENT 0.0 .IP \(bu 2 Fix broken prompt in Nushell when activating virtual environment \- by \X'tty: link https://github.com/kubouc'\fI\%@kubouc\fP\X'tty: link'\&. (\X'tty: link https://github.com/pypa/virtualenv/issues/2481'\fI\%#2481\fP\X'tty: link') .IP \(bu 2 Bump embedded pip to \fB23.0\fP and setuptools to \fB67.1\fP \- by \X'tty: link https://github.com/gaborbernat'\fI\%@gaborbernat\fP\X'tty: link'\&. (\X'tty: link https://github.com/pypa/virtualenv/issues/2489'\fI\%#2489\fP\X'tty: link') .UNINDENT .SS v20.17.1 (2022\-12\-05) .SS Bugfixes \- 20.17.1 .INDENT 0.0 .IP \(bu 2 A \fBpy\fP or \fBpython\fP spec means any Python rather than \fBCPython\fP \- by \X'tty: link https://github.com/gaborbernat'\fI\%@gaborbernat\fP\X'tty: link'\&. (\X'tty: link https://github.com/pypa/virtualenv/issues/2460'\fI\%#2460\fP\X'tty: link') .IP \(bu 2 Make \fBactivate.nu\fP respect \fBVIRTUAL_ENV_DISABLE_PROMPT\fP and not set the prompt if requested \- by \X'tty: link https://github.com/m-lima'\fI\%@m\-lima\fP\X'tty: link'\&. (\X'tty: link https://github.com/pypa/virtualenv/issues/2461'\fI\%#2461\fP\X'tty: link') .UNINDENT .SS v20.17.0 (2022\-11\-27) .SS Features \- 20.17.0 .INDENT 0.0 .IP \(bu 2 Change Nushell activation script to be a module meant to be activated as an overlay. (\X'tty: link https://github.com/pypa/virtualenv/issues/2422'\fI\%#2422\fP\X'tty: link') .IP \(bu 2 Update operator used in Nushell activation script to be compatible with future versions. (\X'tty: link https://github.com/pypa/virtualenv/issues/2450'\fI\%#2450\fP\X'tty: link') .UNINDENT .SS Bugfixes \- 20.17.0 .INDENT 0.0 .IP \(bu 2 Do not use deprecated API from \fBimportlib.resources\fP on Python 3.10 or later \- by \X'tty: link https://github.com/gaborbernat'\fI\%@gaborbernat\fP\X'tty: link'\&. (\X'tty: link https://github.com/pypa/virtualenv/issues/2448'\fI\%#2448\fP\X'tty: link') .IP \(bu 2 Upgrade embedded setuptools to \fB65.6.3\fP from \fB65.5.1\fP \- by \X'tty: link https://github.com/gaborbernat'\fI\%@gaborbernat\fP\X'tty: link'\&. (\X'tty: link https://github.com/pypa/virtualenv/issues/2451'\fI\%#2451\fP\X'tty: link') .UNINDENT .SS v20.16.7 (2022\-11\-12) .SS Bugfixes \- 20.16.7 .INDENT 0.0 .IP \(bu 2 Use parent directory of python executable for pyvenv.cfg \(dqhome\(dq value per PEP 405 \- by \X'tty: link https://github.com/vfazio'\fI\%@vfazio\fP\X'tty: link'\&. (\X'tty: link https://github.com/pypa/virtualenv/issues/2440'\fI\%#2440\fP\X'tty: link') .IP \(bu 2 In POSIX virtual environments, try alternate binary names if \fBsys._base_executable\fP does not exist \- by \X'tty: link https://github.com/vfazio'\fI\%@vfazio\fP\X'tty: link'\&. (\X'tty: link https://github.com/pypa/virtualenv/issues/2442'\fI\%#2442\fP\X'tty: link') .IP \(bu 2 Upgrade embedded wheel to \fB0.38.4\fP and pip to \fB22.3.1\fP from \fB22.3\fP and setuptools to \fB65.5.1\fP from \fB65.5.0\fP \- by \X'tty: link https://github.com/gaborbernat'\fI\%@gaborbernat\fP\X'tty: link'\&. (\X'tty: link https://github.com/pypa/virtualenv/issues/2443'\fI\%#2443\fP\X'tty: link') .UNINDENT .SS v20.16.6 (2022\-10\-25) .SS Features \- 20.16.6 .INDENT 0.0 .IP \(bu 2 Drop unneeded shims for PyPy3 directory structure (\X'tty: link https://github.com/pypa/virtualenv/issues/2426'\fI\%#2426\fP\X'tty: link') .UNINDENT .SS Bugfixes \- 20.16.6 .INDENT 0.0 .IP \(bu 2 Fix selected scheme on debian derivatives for python 3.10 when \fBpython3\-distutils\fP is not installed or the \fBvenv\fP scheme is not available \- by \X'tty: link https://github.com/asottile'\fI\%@asottile\fP\X'tty: link'\&. (\X'tty: link https://github.com/pypa/virtualenv/issues/2350'\fI\%#2350\fP\X'tty: link') .IP \(bu 2 Allow the test suite to pass even with the original C shell (rather than \fBtcsh\fP) \- by \X'tty: link https://github.com/kulikjak'\fI\%@kulikjak\fP\X'tty: link'\&. (\X'tty: link https://github.com/pypa/virtualenv/issues/2418'\fI\%#2418\fP\X'tty: link') .IP \(bu 2 Fix fallback handling of downloading wheels for bundled packages \- by \X'tty: link https://github.com/schaap'\fI\%@schaap\fP\X'tty: link'\&. (\X'tty: link https://github.com/pypa/virtualenv/issues/2429'\fI\%#2429\fP\X'tty: link') .IP \(bu 2 Upgrade embedded setuptools to \fB65.5.0\fP from \fB65.3.0\fP and pip to \fB22.3\fP from \fB22.2.2\fP \- by \X'tty: link https://github.com/gaborbernat'\fI\%@gaborbernat\fP\X'tty: link'\&. (\X'tty: link https://github.com/pypa/virtualenv/issues/2434'\fI\%#2434\fP\X'tty: link') .UNINDENT .SS v20.16.5 (2022\-09\-07) .SS Bugfixes \- 20.16.5 .INDENT 0.0 .IP \(bu 2 Do not turn echo off for subsequent commands in batch activators (\fBactivate.bat\fP and \fBdeactivate.bat\fP) \- by \X'tty: link https://github.com/pawelszramowski'\fI\%@pawelszramowski\fP\X'tty: link'\&. (\X'tty: link https://github.com/pypa/virtualenv/issues/2411'\fI\%#2411\fP\X'tty: link') .UNINDENT .SS v20.16.4 (2022\-08\-29) .SS Bugfixes \- 20.16.4 .INDENT 0.0 .IP \(bu 2 Bump embed setuptools to \fB65.3\fP \- by \X'tty: link https://github.com/gaborbernat'\fI\%@gaborbernat\fP\X'tty: link'\&. (\X'tty: link https://github.com/pypa/virtualenv/issues/2405'\fI\%#2405\fP\X'tty: link') .UNINDENT .SS v20.16.3 (2022\-08\-04) .SS Bugfixes \- 20.16.3 .INDENT 0.0 .IP \(bu 2 Upgrade embedded pip to \fB22.2.2\fP from \fB22.2.1\fP and setuptools to \fB63.4.1\fP from \fB63.2.0\fP \- by \X'tty: link https://github.com/gaborbernat'\fI\%@gaborbernat\fP\X'tty: link'\&. (\X'tty: link https://github.com/pypa/virtualenv/issues/2395'\fI\%#2395\fP\X'tty: link') .UNINDENT .SS v20.16.2 (2022\-07\-27) .SS Bugfixes \- 20.16.2 .INDENT 0.0 .IP \(bu 2 Bump embedded pip from \fB22.2\fP to \fB22.2.1\fP \- by \X'tty: link https://github.com/gaborbernat'\fI\%@gaborbernat\fP\X'tty: link'\&. (\X'tty: link https://github.com/pypa/virtualenv/issues/2391'\fI\%#2391\fP\X'tty: link') .UNINDENT .SS v20.16.1 (2022\-07\-26) .SS Features \- 20.16.1 .INDENT 0.0 .IP \(bu 2 Update Nushell activation scripts to version 0.67 \- by \X'tty: link https://github.com/kubouch'\fI\%@kubouch\fP\X'tty: link'\&. (\X'tty: link https://github.com/pypa/virtualenv/issues/2386'\fI\%#2386\fP\X'tty: link') .UNINDENT .SS v20.16.0 (2022\-07\-25) .SS Features \- 20.16.0 .INDENT 0.0 .IP \(bu 2 Drop support for running under Python 2 (still can generate Python 2 environments) \- by \X'tty: link https://github.com/gaborbernat'\fI\%@gaborbernat\fP\X'tty: link'\&. (\X'tty: link https://github.com/pypa/virtualenv/issues/2382'\fI\%#2382\fP\X'tty: link') .IP \(bu 2 Upgrade embedded pip to \fB22.2\fP from \fB22.1.2\fP and setuptools to \fB63.2.0\fP from \fB62.6.0\fP \- by \X'tty: link https://github.com/gaborbernat'\fI\%@gaborbernat\fP\X'tty: link'\&. (\X'tty: link https://github.com/pypa/virtualenv/issues/2383'\fI\%#2383\fP\X'tty: link') .UNINDENT .SS v20.15.1 (2022\-06\-28) .SS Bugfixes \- 20.15.1 .INDENT 0.0 .IP \(bu 2 Fix the incorrect operation when \fBsetuptools\fP plugins output something into \fBstdout\fP\&. (\X'tty: link https://github.com/pypa/virtualenv/issues/2335'\fI\%#2335\fP\X'tty: link') .IP \(bu 2 CPython3Windows creator ignores missing \fBDLLs\fP dir. (\X'tty: link https://github.com/pypa/virtualenv/issues/2368'\fI\%#2368\fP\X'tty: link') .UNINDENT .SS v20.15.0 (2022\-06\-25) .SS Features \- 20.15.0 .INDENT 0.0 .IP \(bu 2 Support for Windows embeddable Python package: includes \fBpython.zip\fP in the creator sources \- by \X'tty: link https://github.com/reksarka'\fI\%@reksarka\fP\X'tty: link'\&. (\X'tty: link https://github.com/pypa/virtualenv/issues/1774'\fI\%#1774\fP\X'tty: link') .UNINDENT .SS Bugfixes \- 20.15.0 .INDENT 0.0 .IP \(bu 2 Upgrade embedded setuptools to \fB62.3.3\fP from \fB62.6.0\fP and pip to \fB22.1.2\fP from \fB22.0.4\fP \- by \X'tty: link https://github.com/gaborbernat'\fI\%@gaborbernat\fP\X'tty: link'\&. (\X'tty: link https://github.com/pypa/virtualenv/issues/2348'\fI\%#2348\fP\X'tty: link') .IP \(bu 2 Use \fBshlex.quote\fP instead of deprecated \fBpipes.quote\fP in Python 3 \- by \X'tty: link https://github.com/frenzymadness'\fI\%@frenzymadness\fP\X'tty: link'\&. (\X'tty: link https://github.com/pypa/virtualenv/issues/2351'\fI\%#2351\fP\X'tty: link') .IP \(bu 2 Fix Windows PyPy 3.6 \- by \X'tty: link https://github.com/reksarka'\fI\%@reksarka\fP\X'tty: link'\&. (\X'tty: link https://github.com/pypa/virtualenv/issues/2363'\fI\%#2363\fP\X'tty: link') .UNINDENT .SS v20.14.1 (2022\-04\-11) .SS Features \- 20.14.1 .INDENT 0.0 .IP \(bu 2 Support for creating a virtual environment from a Python 2.7 framework on macOS 12 \- by \X'tty: link https://github.com/nickhutchinson'\fI\%@nickhutchinson\fP\X'tty: link'\&. (\X'tty: link https://github.com/pypa/virtualenv/issues/2284'\fI\%#2284\fP\X'tty: link') .UNINDENT .SS Bugfixes \- 20.14.1 .INDENT 0.0 .IP \(bu 2 Upgrade embedded setuptools to \fB62.1.0\fP from \fB61.0.0\fP \- by \X'tty: link https://github.com/gaborbernat'\fI\%@gaborbernat\fP\X'tty: link'\&. (\X'tty: link https://github.com/pypa/virtualenv/issues/2327'\fI\%#2327\fP\X'tty: link') .UNINDENT .SS v20.14.0 (2022\-03\-25) .SS Features \- 20.14.0 .INDENT 0.0 .IP \(bu 2 Support Nushell activation scripts with nu version \fB0.60\fP \- by \X'tty: link https://github.com/kubouch'\fI\%@kubouch\fP\X'tty: link'\&. (\X'tty: link https://github.com/pypa/virtualenv/issues/2321'\fI\%#2321\fP\X'tty: link') .UNINDENT .SS Bugfixes \- 20.14.0 .INDENT 0.0 .IP \(bu 2 Upgrade embedded setuptools to \fB61.0.0\fP from \fB60.10.0\fP \- by \X'tty: link https://github.com/gaborbernat'\fI\%@gaborbernat\fP\X'tty: link'\&. (\X'tty: link https://github.com/pypa/virtualenv/issues/2322'\fI\%#2322\fP\X'tty: link') .UNINDENT .SS v20.13.4 (2022\-03\-18) .SS Bugfixes \- 20.13.4 .INDENT 0.0 .IP \(bu 2 Improve performance of python startup inside created virtualenvs \- by \X'tty: link https://github.com/asottile'\fI\%@asottile\fP\X'tty: link'\&. (\X'tty: link https://github.com/pypa/virtualenv/issues/2317'\fI\%#2317\fP\X'tty: link') .IP \(bu 2 Upgrade embedded setuptools to \fB60.10.0\fP from \fB60.9.3\fP \- by \X'tty: link https://github.com/gaborbernat'\fI\%@gaborbernat\fP\X'tty: link'\&. (\X'tty: link https://github.com/pypa/virtualenv/issues/2320'\fI\%#2320\fP\X'tty: link') .UNINDENT .SS v20.13.3 (2022\-03\-07) .SS Bugfixes \- 20.13.3 .INDENT 0.0 .IP \(bu 2 Avoid symlinking the contents of \fB/usr\fP into PyPy3.8+ virtualenvs \- by \X'tty: link https://github.com/stefanor'\fI\%@stefanor\fP\X'tty: link'\&. (\X'tty: link https://github.com/pypa/virtualenv/issues/2310'\fI\%#2310\fP\X'tty: link') .IP \(bu 2 Bump embed pip from \fB22.0.3\fP to \fB22.0.4\fP \- by \X'tty: link https://github.com/gaborbernat'\fI\%@gaborbernat\fP\X'tty: link'\&. (\X'tty: link https://github.com/pypa/virtualenv/issues/2311'\fI\%#2311\fP\X'tty: link') .UNINDENT .SS v20.13.2 (2022\-02\-24) .SS Bugfixes \- 20.13.2 .INDENT 0.0 .IP \(bu 2 Upgrade embedded setuptools to \fB60.9.3\fP from \fB60.6.0\fP \- by \X'tty: link https://github.com/gaborbernat'\fI\%@gaborbernat\fP\X'tty: link'\&. (\X'tty: link https://github.com/pypa/virtualenv/issues/2306'\fI\%#2306\fP\X'tty: link') .UNINDENT .SS v20.13.1 (2022\-02\-05) .SS Bugfixes \- 20.13.1 .INDENT 0.0 .IP \(bu 2 fix \(dqexecv() arg 2 must contain only strings\(dq error on M1 MacOS (\X'tty: link https://github.com/pypa/virtualenv/issues/2282'\fI\%#2282\fP\X'tty: link') .IP \(bu 2 Upgrade embedded setuptools to \fB60.5.0\fP from \fB60.2.0\fP \- by \X'tty: link https://github.com/asottile'\fI\%@asottile\fP\X'tty: link'\&. (\X'tty: link https://github.com/pypa/virtualenv/issues/2289'\fI\%#2289\fP\X'tty: link') .IP \(bu 2 Upgrade embedded pip to \fB22.0.3\fP and setuptools to \fB60.6.0\fP \- by \X'tty: link https://github.com/gaborbernat'\fI\%@gaborbernat\fP\X'tty: link' and \X'tty: link https://github.com/asottile'\fI\%@asottile\fP\X'tty: link'\&. (\X'tty: link https://github.com/pypa/virtualenv/issues/2294'\fI\%#2294\fP\X'tty: link') .UNINDENT .SS v20.13.0 (2022\-01\-02) .SS Features \- 20.13.0 .INDENT 0.0 .IP \(bu 2 Add downloaded wheel information in the relevant JSON embed file to prevent additional downloads of the same wheel. \- by \X'tty: link https://github.com/mayeut'\fI\%@mayeut\fP\X'tty: link'\&. (\X'tty: link https://github.com/pypa/virtualenv/issues/2268'\fI\%#2268\fP\X'tty: link') .UNINDENT .SS Bugfixes \- 20.13.0 .INDENT 0.0 .IP \(bu 2 Fix \fBAttributeError: \(aqbool\(aq object has no attribute \(aqerror\(aq\fP when creating a Python 2.x virtualenv on macOS \- by \fBmoreati\fP\&. (\X'tty: link https://github.com/pypa/virtualenv/issues/2269'\fI\%#2269\fP\X'tty: link') .IP \(bu 2 Fix \fBPermissionError: [Errno 1] Operation not permitted\fP when creating a Python 2.x virtualenv on macOS/arm64 \- by \fBmoreati\fP\&. (\X'tty: link https://github.com/pypa/virtualenv/issues/2271'\fI\%#2271\fP\X'tty: link') .UNINDENT .SS v20.12.1 (2022\-01\-01) .SS Bugfixes \- 20.12.1 .INDENT 0.0 .IP \(bu 2 Try using previous updates of \fBpip\fP, \fBsetuptools\fP & \fBwheel\fP when inside an update grace period rather than always falling back to embedded wheels \- by \X'tty: link https://github.com/mayeut'\fI\%@mayeut\fP\X'tty: link'\&. (\X'tty: link https://github.com/pypa/virtualenv/issues/2265'\fI\%#2265\fP\X'tty: link') .IP \(bu 2 New patch versions of \fBpip\fP, \fBsetuptools\fP & \fBwheel\fP are now returned in the expected timeframe. \- by \X'tty: link https://github.com/mayeut'\fI\%@mayeut\fP\X'tty: link'\&. (\X'tty: link https://github.com/pypa/virtualenv/issues/2266'\fI\%#2266\fP\X'tty: link') .IP \(bu 2 Manual upgrades of \fBpip\fP, \fBsetuptools\fP & \fBwheel\fP are not discarded by a periodic update \- by \X'tty: link https://github.com/mayeut'\fI\%@mayeut\fP\X'tty: link'\&. (\X'tty: link https://github.com/pypa/virtualenv/issues/2267'\fI\%#2267\fP\X'tty: link') .UNINDENT .SS v20.12.0 (2021\-12\-31) .SS Features \- 20.12.0 .INDENT 0.0 .IP \(bu 2 Sign the python2 exe on Darwin arm64 \- by \X'tty: link https://github.com/tmspicer'\fI\%@tmspicer\fP\X'tty: link'\&. (\X'tty: link https://github.com/pypa/virtualenv/issues/2233'\fI\%#2233\fP\X'tty: link') .UNINDENT .SS Bugfixes \- 20.12.0 .INDENT 0.0 .IP \(bu 2 Fix \fB\-\-download\fP option \- by \X'tty: link https://github.com/mayeut'\fI\%@mayeut\fP\X'tty: link'\&. (\X'tty: link https://github.com/pypa/virtualenv/issues/2120'\fI\%#2120\fP\X'tty: link') .IP \(bu 2 Upgrade embedded setuptools to \fB60.2.0\fP from \fB60.1.1\fP \- by \X'tty: link https://github.com/gaborbernat'\fI\%@gaborbernat\fP\X'tty: link'\&. (\X'tty: link https://github.com/pypa/virtualenv/issues/2263'\fI\%#2263\fP\X'tty: link') .UNINDENT .SS v20.11.2 (2021\-12\-29) .SS Bugfixes \- 20.11.2 .INDENT 0.0 .IP \(bu 2 Fix installation of pinned versions of \fBpip\fP, \fBsetuptools\fP & \fBwheel\fP \- by \X'tty: link https://github.com/mayeut'\fI\%@mayeut\fP\X'tty: link'\&. (\X'tty: link https://github.com/pypa/virtualenv/issues/2203'\fI\%#2203\fP\X'tty: link') .UNINDENT .SS v20.11.1 (2021\-12\-29) .SS Bugfixes \- 20.11.1 .INDENT 0.0 .IP \(bu 2 Bump embed setuptools to \fB60.1.1\fP from \fB60.1.0\fP \- by \X'tty: link https://github.com/gaborbernat'\fI\%@gaborbernat\fP\X'tty: link'\&. (\X'tty: link https://github.com/pypa/virtualenv/issues/2258'\fI\%#2258\fP\X'tty: link') .UNINDENT .SS v20.11.0 (2021\-12\-28) .SS Features \- 20.11.0 .INDENT 0.0 .IP \(bu 2 Avoid deprecation warning from py\-filelock argument \- by \X'tty: link https://github.com/ofek'\fI\%@ofek\fP\X'tty: link'\&. (\X'tty: link https://github.com/pypa/virtualenv/issues/2237'\fI\%#2237\fP\X'tty: link') .IP \(bu 2 Upgrade embedded setuptools to \fB61.1.0\fP from \fB58.3.0\fP \- by \X'tty: link https://github.com/gaborbernat'\fI\%@gaborbernat\fP\X'tty: link'\&. (\X'tty: link https://github.com/pypa/virtualenv/issues/2240'\fI\%#2240\fP\X'tty: link') .IP \(bu 2 Drop the runtime dependency of \fBbackports.entry\-points\-selectable\fP \- by \X'tty: link https://github.com/hroncok'\fI\%@hroncok\fP\X'tty: link'\&. (\X'tty: link https://github.com/pypa/virtualenv/issues/2246'\fI\%#2246\fP\X'tty: link') .IP \(bu 2 Fish: PATH variables should not be quoted when being set \- by \X'tty: link https://github.com/d3dave'\fI\%@d3dave\fP\X'tty: link'\&. (\X'tty: link https://github.com/pypa/virtualenv/issues/2248'\fI\%#2248\fP\X'tty: link') .UNINDENT .SS v20.10.0 (2021\-11\-01) .SS Features \- 20.10.0 .INDENT 0.0 .IP \(bu 2 If a \fB\(dqvenv\(dq\fP install scheme exists in \fBsysconfig\fP, virtualenv now uses it to create new virtual environments. This allows Python distributors, such as Fedora, to patch/replace the default install scheme without affecting the paths in new virtual environments. A similar technique \X'tty: link https://bugs.python.org/issue45413'\fI\%was proposed to Python, for the venv module\fP\X'tty: link' \- by \fBhroncok\fP (\X'tty: link https://github.com/pypa/virtualenv/issues/2208'\fI\%#2208\fP\X'tty: link') .IP \(bu 2 The activated virtualenv prompt is now always wrapped in parentheses. This affects venvs created with the \fB\-\-prompt\fP attribute, and matches virtualenv\(aqs behavior on par with venv. (\X'tty: link https://github.com/pypa/virtualenv/issues/2224'\fI\%#2224\fP\X'tty: link') .UNINDENT .SS Bugfixes \- 20.10.0 .INDENT 0.0 .IP \(bu 2 Fix broken prompt set up by activate.bat \- by \X'tty: link https://github.com/SiggyBar'\fI\%@SiggyBar\fP\X'tty: link'\&. (\X'tty: link https://github.com/pypa/virtualenv/issues/2225'\fI\%#2225\fP\X'tty: link') .UNINDENT .SS v20.9.0 (2021\-10\-23) .SS Features \- 20.9.0 .INDENT 0.0 .IP \(bu 2 Special\-case \fB\-\-prompt .\fP to the name of the current directory \- by \X'tty: link https://github.com/rkm'\fI\%@rkm\fP\X'tty: link'\&. (\X'tty: link https://github.com/pypa/virtualenv/issues/2220'\fI\%#2220\fP\X'tty: link') .IP \(bu 2 Add libffi\-8.dll to pypy windows \X'tty: link https://github.com/pypa/virtualenv/issues/2218'\fI\%#2218\fP\X'tty: link' \- by \X'tty: link https://github.com/mattip'\fI\%@mattip\fP\X'tty: link' .UNINDENT .SS Bugfixes \- 20.9.0 .INDENT 0.0 .IP \(bu 2 Fixed path collision that could lead to a PermissionError or writing to system directories when using PyPy3.8 \- by \X'tty: link https://github.com/mgorny'\fI\%@mgorny\fP\X'tty: link'\&. (\X'tty: link https://github.com/pypa/virtualenv/issues/2182'\fI\%#2182\fP\X'tty: link') .IP \(bu 2 Upgrade embedded setuptools to \fB58.3.0\fP from \fB58.1.0\fP and pip to \fB21.3.1\fP from \fB21.2.4\fP \- by \X'tty: link https://github.com/gaborbernat'\fI\%@gaborbernat\fP\X'tty: link'\&. (\X'tty: link https://github.com/pypa/virtualenv/issues/2205'\fI\%#2205\fP\X'tty: link') .IP \(bu 2 Remove stray closing parenthesis in activate.bat \- by \X'tty: link https://github.com/SiggyBar'\fI\%@SiggyBar\fP\X'tty: link'\&. (\X'tty: link https://github.com/pypa/virtualenv/issues/2221'\fI\%#2221\fP\X'tty: link') .UNINDENT .SS v20.8.1 (2021\-09\-24) .SS Bugfixes \- 20.8.1 .INDENT 0.0 .IP \(bu 2 Fixed a bug where while creating a venv on top of an existing one, without cleaning, when seeded wheel version mismatch occurred, multiple \fB\&.dist\-info\fP directories may be present, confounding entrypoint discovery \- by \X'tty: link https://github.com/arcivanov'\fI\%@arcivanov\fP\X'tty: link' (\X'tty: link https://github.com/pypa/virtualenv/issues/2185'\fI\%#2185\fP\X'tty: link') .IP \(bu 2 Bump embed setuptools from \fB58.0.4\fP to \fB58.1.0\fP \- by \X'tty: link https://github.com/gaborbernat'\fI\%@gaborbernat\fP\X'tty: link'\&. (\X'tty: link https://github.com/pypa/virtualenv/issues/2195'\fI\%#2195\fP\X'tty: link') .UNINDENT .SS Misc \- 20.8.1 .INDENT 0.0 .IP \(bu 2 \X'tty: link https://github.com/pypa/virtualenv/issues/2189'\fI\%#2189\fP\X'tty: link' .UNINDENT .SS v20.8.0 (2021\-09\-16) .INDENT 0.0 .IP \(bu 2 upgrade embedded setuptools to \fB58.0.4\fP from \fB57.4.0\fP and pip to \fB21.2.4\fP from \fB21.2.3\fP .IP \(bu 2 Add nushell activation script .UNINDENT .SS v20.7.2 (2021\-08\-10) .SS Bugfixes \- 20.7.2 .INDENT 0.0 .IP \(bu 2 Upgrade embedded pip to \fB21.2.3\fP from \fB21.2.2\fP and wheel to \fB0.37.0\fP from \fB0.36.2\fP \- by \X'tty: link https://github.com/gaborbernat'\fI\%@gaborbernat\fP\X'tty: link'\&. (\X'tty: link https://github.com/pypa/virtualenv/issues/2168'\fI\%#2168\fP\X'tty: link') .UNINDENT .SS v20.7.1 (2021\-08\-09) .SS Bugfixes \- 20.7.1 .INDENT 0.0 .IP \(bu 2 Fix unpacking dictionary items in PythonInfo.install_path (\X'tty: link https://github.com/pypa/virtualenv/issues/2165'\fI\%#2165\fP\X'tty: link') .UNINDENT .SS v20.7.0 (2021\-07\-31) .SS Bugfixes \- 20.7.0 .INDENT 0.0 .IP \(bu 2 upgrade embedded pip to \fB21.2.2\fP from \fB21.1.3\fP and setuptools to \fB57.4.0\fP from \fB57.1.0\fP \- by \X'tty: link https://github.com/gaborbernat'\fI\%@gaborbernat\fP\X'tty: link' (\X'tty: link https://github.com/pypa/virtualenv/issues/2159'\fI\%#2159\fP\X'tty: link') .UNINDENT .SS Deprecations and Removals \- 20.7.0 .INDENT 0.0 .IP \(bu 2 Removed \fBxonsh\fP activator due to this breaking fairly often the CI and lack of support from those packages maintainers, upstream is encouraged to continue supporting the project as a \X'tty: link https://github.com/xonsh/xonsh/issues/3689'\fI\%plugin\fP\X'tty: link' \- by \X'tty: link https://github.com/gaborbernat'\fI\%@gaborbernat\fP\X'tty: link'\&. (\X'tty: link https://github.com/pypa/virtualenv/issues/2160'\fI\%#2160\fP\X'tty: link') .UNINDENT .SS v20.6.0 (2021\-07\-14) .SS Features \- 20.6.0 .INDENT 0.0 .IP \(bu 2 Support Python interpreters without \fBdistutils\fP (fallback to \fBsyconfig\fP in these cases) \- by \X'tty: link https://github.com/gaborbernat'\fI\%@gaborbernat\fP\X'tty: link'\&. (\X'tty: link https://github.com/pypa/virtualenv/issues/1910'\fI\%#1910\fP\X'tty: link') .UNINDENT .SS v20.5.0 (2021\-07\-13) .SS Features \- 20.5.0 .INDENT 0.0 .IP \(bu 2 Plugins now use \(aqselectable\(aq entry points \- by \X'tty: link https://github.com/jaraco'\fI\%@jaraco\fP\X'tty: link'\&. (\X'tty: link https://github.com/pypa/virtualenv/issues/2093'\fI\%#2093\fP\X'tty: link') .IP \(bu 2 add libffi\-7.dll to the hard\-coded list of dlls for PyPy (\X'tty: link https://github.com/pypa/virtualenv/issues/2141'\fI\%#2141\fP\X'tty: link') .IP \(bu 2 Use the better maintained \fBplatformdirs\fP instead of \fBappdirs\fP \- by \X'tty: link https://github.com/gaborbernat'\fI\%@gaborbernat\fP\X'tty: link'\&. (\X'tty: link https://github.com/pypa/virtualenv/issues/2142'\fI\%#2142\fP\X'tty: link') .UNINDENT .SS Bugfixes \- 20.5.0 .INDENT 0.0 .IP \(bu 2 Bump pip the embedded pip \fB21.1.3\fP and setuptools to \fB57.1.0\fP \- by \X'tty: link https://github.com/gaborbernat'\fI\%@gaborbernat\fP\X'tty: link'\&. (\X'tty: link https://github.com/pypa/virtualenv/issues/2135'\fI\%#2135\fP\X'tty: link') .UNINDENT .SS Deprecations and Removals \- 20.5.0 .INDENT 0.0 .IP \(bu 2 Drop python \fB3.4\fP support as it has been over 2 years since EOL \- by \X'tty: link https://github.com/gaborbernat'\fI\%@gaborbernat\fP\X'tty: link'\&. (\X'tty: link https://github.com/pypa/virtualenv/issues/2141'\fI\%#2141\fP\X'tty: link') .UNINDENT .SS v20.4.7 (2021\-05\-24) .SS Bugfixes \- 20.4.7 .INDENT 0.0 .IP \(bu 2 Upgrade embedded pip to \fB21.1.2\fP and setuptools to \fB57.0.0\fP \- by \X'tty: link https://github.com/gaborbernat'\fI\%@gaborbernat\fP\X'tty: link'\&. (\X'tty: link https://github.com/pypa/virtualenv/issues/2123'\fI\%#2123\fP\X'tty: link') .UNINDENT .SS v20.4.6 (2021\-05\-05) .SS Bugfixes \- 20.4.6 .INDENT 0.0 .IP \(bu 2 Fix \fBsite.getsitepackages()\fP broken on python2 on debian \- by \X'tty: link https://github.com/freundTech'\fI\%@freundTech\fP\X'tty: link'\&. (\X'tty: link https://github.com/pypa/virtualenv/issues/2105'\fI\%#2105\fP\X'tty: link') .UNINDENT .SS v20.4.5 (2021\-05\-05) .SS Bugfixes \- 20.4.5 .INDENT 0.0 .IP \(bu 2 Bump pip to \fB21.1.1\fP from \fB21.0.1\fP \- by \X'tty: link https://github.com/gaborbernat'\fI\%@gaborbernat\fP\X'tty: link'\&. (\X'tty: link https://github.com/pypa/virtualenv/issues/2104'\fI\%#2104\fP\X'tty: link') .IP \(bu 2 Fix \fBsite.getsitepackages()\fP ignoring \fB\-\-system\-site\-packages\fP on python2 \- by \X'tty: link https://github.com/freundTech'\fI\%@freundTech\fP\X'tty: link'\&. (\X'tty: link https://github.com/pypa/virtualenv/issues/2106'\fI\%#2106\fP\X'tty: link') .UNINDENT .SS v20.4.4 (2021\-04\-20) .SS Bugfixes \- 20.4.4 .INDENT 0.0 .IP \(bu 2 Built in discovery class is always preferred over plugin supplied classes. (\X'tty: link https://github.com/pypa/virtualenv/issues/2087'\fI\%#2087\fP\X'tty: link') .IP \(bu 2 Upgrade embedded setuptools to \fB56.0.0\fP by \X'tty: link https://github.com/gaborbernat'\fI\%@gaborbernat\fP\X'tty: link'\&. (\X'tty: link https://github.com/pypa/virtualenv/issues/2094'\fI\%#2094\fP\X'tty: link') .UNINDENT .SS v20.4.3 (2021\-03\-16) .SS Bugfixes \- 20.4.3 .INDENT 0.0 .IP \(bu 2 Bump embedded setuptools from \fB52.0.0\fP to \fB54.1.2\fP \- by \X'tty: link https://github.com/gaborbernat'\fI\%@gaborbernat\fP\X'tty: link' (\X'tty: link https://github.com/pypa/virtualenv/issues/2069'\fI\%#2069\fP\X'tty: link') .IP \(bu 2 Fix PyPy3 stdlib on Windows is incorrect \- by \X'tty: link https://github.com/gaborbernat'\fI\%@gaborbernat\fP\X'tty: link'\&. (\X'tty: link https://github.com/pypa/virtualenv/issues/2071'\fI\%#2071\fP\X'tty: link') .UNINDENT .SS v20.4.2 (2021\-02\-01) .SS Bugfixes \- 20.4.2 .INDENT 0.0 .IP \(bu 2 Running virtualenv \fB\-\-upgrade\-embed\-wheels\fP crashes \- by \X'tty: link https://github.com/gaborbernat'\fI\%@gaborbernat\fP\X'tty: link'\&. (\X'tty: link https://github.com/pypa/virtualenv/issues/2058'\fI\%#2058\fP\X'tty: link') .UNINDENT .SS v20.4.1 (2021\-01\-31) .SS Bugfixes \- 20.4.1 .INDENT 0.0 .IP \(bu 2 Bump embedded pip and setuptools packages to latest upstream supported (\fB21.0.1\fP and \fB52.0.0\fP) \- by \X'tty: link https://github.com/gaborbernat'\fI\%@gaborbernat\fP\X'tty: link'\&. (\X'tty: link https://github.com/pypa/virtualenv/issues/2060'\fI\%#2060\fP\X'tty: link') .UNINDENT .SS v20.4.0 (2021\-01\-19) .SS Features \- 20.4.0 .INDENT 0.0 .IP \(bu 2 On the programmatic API allow passing in the environment variable dictionary to use, defaults to \fBos.environ\fP if not specified \- by \X'tty: link https://github.com/gaborbernat'\fI\%@gaborbernat\fP\X'tty: link'\&. (\X'tty: link https://github.com/pypa/virtualenv/issues/2054'\fI\%#2054\fP\X'tty: link') .UNINDENT .SS Bugfixes \- 20.4.0 .INDENT 0.0 .IP \(bu 2 Upgrade embedded setuptools to \fB51.3.3\fP from \fB51.1.2\fP \- by \X'tty: link https://github.com/gaborbernat'\fI\%@gaborbernat\fP\X'tty: link'\&. (\X'tty: link https://github.com/pypa/virtualenv/issues/2055'\fI\%#2055\fP\X'tty: link') .UNINDENT .SS v20.3.1 (2021\-01\-13) .SS Bugfixes \- 20.3.1 .INDENT 0.0 .IP \(bu 2 Bump embed pip to \fB20.3.3\fP, setuptools to \fB51.1.1\fP and wheel to \fB0.36.2\fP \- by \X'tty: link https://github.com/gaborbernat'\fI\%@gaborbernat\fP\X'tty: link'\&. (\X'tty: link https://github.com/pypa/virtualenv/issues/2036'\fI\%#2036\fP\X'tty: link') .IP \(bu 2 Allow unfunctioning of pydoc to fail freely so that virtualenvs can be activated under Zsh with set \-e (since otherwise \fBunset \-f\fP and \fBunfunction\fP exit with 1 if the function does not exist in Zsh) \- by \X'tty: link https://github.com/d125q'\fI\%@d125q\fP\X'tty: link'\&. (\X'tty: link https://github.com/pypa/virtualenv/issues/2049'\fI\%#2049\fP\X'tty: link') .IP \(bu 2 Drop cached python information if the system executable is no longer present (for example when the executable is a shim and the mapped executable is replaced \- such is the case with pyenv) \- by \X'tty: link https://github.com/gaborbernat'\fI\%@gaborbernat\fP\X'tty: link'\&. (\X'tty: link https://github.com/pypa/virtualenv/issues/2050'\fI\%#2050\fP\X'tty: link') .UNINDENT .SS v20.3.0 (2021\-01\-10) .SS Features \- 20.3.0 .INDENT 0.0 .IP \(bu 2 The builtin discovery takes now a \fB\-\-try\-first\-with\fP argument and is first attempted as valid interpreters. One can use this to force discovery of a given python executable when the discovery order/mechanism raises errors \- by \X'tty: link https://github.com/gaborbernat'\fI\%@gaborbernat\fP\X'tty: link'\&. (\X'tty: link https://github.com/pypa/virtualenv/issues/2046'\fI\%#2046\fP\X'tty: link') .UNINDENT .SS Bugfixes \- 20.3.0 .INDENT 0.0 .IP \(bu 2 On Windows python \fB3.7+\fP distributions where the exe shim is missing fallback to the old ways \- by \X'tty: link https://github.com/gaborbernat'\fI\%@gaborbernat\fP\X'tty: link'\&. (\X'tty: link https://github.com/pypa/virtualenv/issues/1986'\fI\%#1986\fP\X'tty: link') .IP \(bu 2 When discovering interpreters on Windows, via the PEP\-514, prefer \fBPythonCore\fP releases over other ones. virtualenv is used via pip mostly by this distribution, so prefer it over other such as conda \- by \X'tty: link https://github.com/gaborbernat'\fI\%@gaborbernat\fP\X'tty: link'\&. (\X'tty: link https://github.com/pypa/virtualenv/issues/2046'\fI\%#2046\fP\X'tty: link') .UNINDENT .SS v20.2.2 (2020\-12\-07) .SS Bugfixes \- 20.2.2 .INDENT 0.0 .IP \(bu 2 Bump pip to \fB20.3.1\fP, setuptools to \fB51.0.0\fP and wheel to \fB0.36.1\fP \- by \X'tty: link https://github.com/gaborbernat'\fI\%@gaborbernat\fP\X'tty: link'\&. (\X'tty: link https://github.com/pypa/virtualenv/issues/2029'\fI\%#2029\fP\X'tty: link') .UNINDENT .SS v20.2.1 (2020\-11\-23) .sp No significant changes. .SS v20.2.0 (2020\-11\-21) .SS Features \- 20.2.0 .INDENT 0.0 .IP \(bu 2 Optionally skip VCS ignore directive for entire virtualenv directory, using option \fI\%no\-vcs\-ignore\fP, by default \fBFalse\fP\&. (\X'tty: link https://github.com/pypa/virtualenv/issues/2003'\fI\%#2003\fP\X'tty: link') .IP \(bu 2 Add \fB\-\-read\-only\-app\-data\fP option to allow for creation based on an existing app data cache which is non\-writable. This may be useful (for example) to produce a docker image where the app\-data is pre\-populated. .INDENT 2.0 .INDENT 3.5 .sp .EX ENV \e VIRTUALENV_OVERRIDE_APP_DATA=/opt/virtualenv/cache \e 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 .EE .UNINDENT .UNINDENT .sp Patch by \X'tty: link https://github.com/asottile'\fI\%@asottile\fP\X'tty: link'\&. (\X'tty: link https://github.com/pypa/virtualenv/issues/2009'\fI\%#2009\fP\X'tty: link') .UNINDENT .SS Bugfixes \- 20.2.0 .INDENT 0.0 .IP \(bu 2 Fix processing of the \fBVIRTUALENV_PYTHON\fP environment variable and make it multi\-value as well (separated by comma) \- by \X'tty: link https://github.com/pneff'\fI\%@pneff\fP\X'tty: link'\&. (\X'tty: link https://github.com/pypa/virtualenv/issues/1998'\fI\%#1998\fP\X'tty: link') .UNINDENT .SS v20.1.0 (2020\-10\-25) .SS Features \- 20.1.0 .INDENT 0.0 .IP \(bu 2 The python specification can now take one or more values, first found is used to create the virtual environment \- by \X'tty: link https://github.com/gaborbernat'\fI\%@gaborbernat\fP\X'tty: link'\&. (\X'tty: link https://github.com/pypa/virtualenv/issues/1995'\fI\%#1995\fP\X'tty: link') .UNINDENT .SS v20.0.35 (2020\-10\-15) .SS Bugfixes \- 20.0.35 .INDENT 0.0 .IP \(bu 2 Bump embedded setuptools from \fB50.3.0\fP to \fB50.3.1\fP \- by \X'tty: link https://github.com/gaborbernat'\fI\%@gaborbernat\fP\X'tty: link'\&. (\X'tty: link https://github.com/pypa/virtualenv/issues/1982'\fI\%#1982\fP\X'tty: link') .IP \(bu 2 After importing virtualenv passing cwd to a subprocess calls breaks with \fBinvalid directory\fP \- by \X'tty: link https://github.com/gaborbernat'\fI\%@gaborbernat\fP\X'tty: link'\&. (\X'tty: link https://github.com/pypa/virtualenv/issues/1983'\fI\%#1983\fP\X'tty: link') .UNINDENT .SS v20.0.34 (2020\-10\-12) .SS Bugfixes \- 20.0.34 .INDENT 0.0 .IP \(bu 2 Align with venv module when creating virtual environments with builtin creator on Windows 3.7 and later \- by \X'tty: link https://github.com/gaborbernat'\fI\%@gaborbernat\fP\X'tty: link'\&. (\X'tty: link https://github.com/pypa/virtualenv/issues/1782'\fI\%#1782\fP\X'tty: link') .IP \(bu 2 Handle Cygwin path conversion in the activation script \- by \X'tty: link https://github.com/davidcoghlan'\fI\%@davidcoghlan\fP\X'tty: link'\&. (\X'tty: link https://github.com/pypa/virtualenv/issues/1969'\fI\%#1969\fP\X'tty: link') .UNINDENT .SS v20.0.33 (2020\-10\-04) .SS Bugfixes \- 20.0.33 .INDENT 0.0 .IP \(bu 2 Fix \fBNone\fP type error in cygwin if POSIX path in dest \- by \X'tty: link https://github.com/danyeaw'\fI\%@danyeaw\fP\X'tty: link'\&. (\X'tty: link https://github.com/pypa/virtualenv/issues/1962'\fI\%#1962\fP\X'tty: link') .IP \(bu 2 Fix Python 3.4 incompatibilities (added back to the CI) \- by \X'tty: link https://github.com/gaborbernat'\fI\%@gaborbernat\fP\X'tty: link'\&. (\X'tty: link https://github.com/pypa/virtualenv/issues/1963'\fI\%#1963\fP\X'tty: link') .UNINDENT .SS v20.0.32 (2020\-10\-01) .SS Bugfixes \- 20.0.32 .INDENT 0.0 .IP \(bu 2 For activation scripts always use UNIX line endings (unless it\(aqs BATCH shell related) \- by \X'tty: link https://github.com/saytosid'\fI\%@saytosid\fP\X'tty: link'\&. (\X'tty: link https://github.com/pypa/virtualenv/issues/1818'\fI\%#1818\fP\X'tty: link') .IP \(bu 2 Upgrade embedded pip to \fB20.2.1\fP and setuptools to \fB49.4.0\fP \- by \X'tty: link https://github.com/gaborbernat'\fI\%@gaborbernat\fP\X'tty: link'\&. (\X'tty: link https://github.com/pypa/virtualenv/issues/1918'\fI\%#1918\fP\X'tty: link') .IP \(bu 2 Avoid spawning new windows when doing seed package upgrades in the background on Windows \- by \X'tty: link https://github.com/gaborbernat'\fI\%@gaborbernat\fP\X'tty: link'\&. (\X'tty: link https://github.com/pypa/virtualenv/issues/1928'\fI\%#1928\fP\X'tty: link') .IP \(bu 2 Fix a bug that reading and writing on the same file may cause race on multiple processes. (\X'tty: link https://github.com/pypa/virtualenv/issues/1938'\fI\%#1938\fP\X'tty: link') .IP \(bu 2 Upgrade embedded setuptools to \fB50.2.0\fP and pip to \fB20.2.3\fP \- by \X'tty: link https://github.com/gaborbernat'\fI\%@gaborbernat\fP\X'tty: link'\&. (\X'tty: link https://github.com/pypa/virtualenv/issues/1939'\fI\%#1939\fP\X'tty: link') .IP \(bu 2 Provide correct path for bash activator in cygwin or msys2 \- by \X'tty: link https://github.com/danyeaw'\fI\%@danyeaw\fP\X'tty: link'\&. (\X'tty: link https://github.com/pypa/virtualenv/issues/1940'\fI\%#1940\fP\X'tty: link') .IP \(bu 2 Relax importlib requirement to allow version<3 \- by \X'tty: link https://github.com/usamasadiq'\fI\%@usamasadiq\fP\X'tty: link' (\X'tty: link https://github.com/pypa/virtualenv/issues/1953'\fI\%#1953\fP\X'tty: link') .IP \(bu 2 pth files were not processed on CPython2 if $PYTHONPATH was pointing to site\-packages/ \- by \X'tty: link https://github.com/navytux'\fI\%@navytux\fP\X'tty: link'\&. (\X'tty: link https://github.com/pypa/virtualenv/issues/1959'\fI\%#1959\fP\X'tty: link') (\X'tty: link https://github.com/pypa/virtualenv/issues/1960'\fI\%#1960\fP\X'tty: link') .UNINDENT .SS v20.0.31 (2020\-08\-17) .SS Bugfixes \- 20.0.31 .INDENT 0.0 .IP \(bu 2 Upgrade embedded pip to \fB20.2.1\fP, setuptools to \fB49.6.0\fP and wheel to \fB0.35.1\fP \- by \X'tty: link https://github.com/gaborbernat'\fI\%@gaborbernat\fP\X'tty: link'\&. (\X'tty: link https://github.com/pypa/virtualenv/issues/1918'\fI\%#1918\fP\X'tty: link') .UNINDENT .SS v20.0.30 (2020\-08\-04) .SS Bugfixes \- 20.0.30 .INDENT 0.0 .IP \(bu 2 Upgrade pip to \fB20.2.1\fP and setuptools to \fB49.2.1\fP \- by \X'tty: link https://github.com/gaborbernat'\fI\%@gaborbernat\fP\X'tty: link'\&. (\X'tty: link https://github.com/pypa/virtualenv/issues/1915'\fI\%#1915\fP\X'tty: link') .UNINDENT .SS v20.0.29 (2020\-07\-31) .SS Bugfixes \- 20.0.29 .INDENT 0.0 .IP \(bu 2 Upgrade embedded pip from version \fB20.1.2\fP to \fB20.2\fP \- by \X'tty: link https://github.com/gaborbernat'\fI\%@gaborbernat\fP\X'tty: link'\&. (\X'tty: link https://github.com/pypa/virtualenv/issues/1909'\fI\%#1909\fP\X'tty: link') .UNINDENT .SS v20.0.28 (2020\-07\-24) .SS Bugfixes \- 20.0.28 .INDENT 0.0 .IP \(bu 2 Fix test suite failing if run from system Python \- by \X'tty: link https://github.com/gaborbernat'\fI\%@gaborbernat\fP\X'tty: link'\&. (\X'tty: link https://github.com/pypa/virtualenv/issues/1882'\fI\%#1882\fP\X'tty: link') .IP \(bu 2 Provide \fBsetup_logging\fP flag to python API so that users can bypass logging handling if their application already performs this \- by \X'tty: link https://github.com/gaborbernat'\fI\%@gaborbernat\fP\X'tty: link'\&. (\X'tty: link https://github.com/pypa/virtualenv/issues/1896'\fI\%#1896\fP\X'tty: link') .IP \(bu 2 Use \fB\en\fP instead if \fB\er\en\fP as line separator for report (because Python already performs this transformation automatically upon write to the logging pipe) \- by \X'tty: link https://github.com/gaborbernat'\fI\%@gaborbernat\fP\X'tty: link'\&. (\X'tty: link https://github.com/pypa/virtualenv/issues/1905'\fI\%#1905\fP\X'tty: link') .UNINDENT .SS v20.0.27 (2020\-07\-15) .SS Bugfixes \- 20.0.27 .INDENT 0.0 .IP \(bu 2 No longer preimport threading to fix support for \X'tty: link https://pypi.org/project/pygolang/#gpython'\fI\%gpython\fP\X'tty: link' and \X'tty: link https://www.gevent.org/'\fI\%gevent\fP\X'tty: link' \- by \X'tty: link https://github.com/navytux'\fI\%@navytux\fP\X'tty: link'\&. (\X'tty: link https://github.com/pypa/virtualenv/issues/1897'\fI\%#1897\fP\X'tty: link') .IP \(bu 2 Upgrade setuptools from \fB49.2.0\fP on \fBPython 3.5+\fP \- by \X'tty: link https://github.com/gaborbernat'\fI\%@gaborbernat\fP\X'tty: link'\&. (\X'tty: link https://github.com/pypa/virtualenv/issues/1898'\fI\%#1898\fP\X'tty: link') .UNINDENT .SS v20.0.26 (2020\-07\-07) .SS Bugfixes \- 20.0.26 .INDENT 0.0 .IP \(bu 2 Bump dependency \fBdistutils >= 0.3.1\fP \- by \X'tty: link https://github.com/gaborbernat'\fI\%@gaborbernat\fP\X'tty: link'\&. (\X'tty: link https://github.com/pypa/virtualenv/issues/1880'\fI\%#1880\fP\X'tty: link') .IP \(bu 2 Improve periodic update handling: .INDENT 2.0 .IP \(bu 2 better logging output while running and enable logging on background process call ( \fB_VIRTUALENV_PERIODIC_UPDATE_INLINE\fP may be used to debug behavior inline) .IP \(bu 2 fallback to unverified context when querying the PyPi for release date, .IP \(bu 2 stop downloading wheels once we reach the embedded version, .UNINDENT .sp by \X'tty: link https://github.com/gaborbernat'\fI\%@gaborbernat\fP\X'tty: link'\&. (\X'tty: link https://github.com/pypa/virtualenv/issues/1883'\fI\%#1883\fP\X'tty: link') .IP \(bu 2 Do not print error message if the application exists with \fBSystemExit(0)\fP \- by \X'tty: link https://github.com/gaborbernat'\fI\%@gaborbernat\fP\X'tty: link'\&. (\X'tty: link https://github.com/pypa/virtualenv/issues/1885'\fI\%#1885\fP\X'tty: link') .IP \(bu 2 Upgrade embedded setuptools from \fB47.3.1\fP to \fB49.1.0\fP for Python \fB3.5+\fP \- by \X'tty: link https://github.com/gaborbernat'\fI\%@gaborbernat\fP\X'tty: link'\&. (\X'tty: link https://github.com/pypa/virtualenv/issues/1887'\fI\%#1887\fP\X'tty: link') .UNINDENT .SS v20.0.25 (2020\-06\-23) .SS Bugfixes \- 20.0.25 .INDENT 0.0 .IP \(bu 2 Fix that when the \fBapp\-data\fP seeders image creation fails the exception is silently ignored. Avoid two virtual environment creations to step on each others toes by using a lock while creating the base images. By \X'tty: link https://github.com/gaborbernat'\fI\%@gaborbernat\fP\X'tty: link'\&. (\X'tty: link https://github.com/pypa/virtualenv/issues/1869'\fI\%#1869\fP\X'tty: link') .UNINDENT .SS v20.0.24 (2020\-06\-22) .SS Features \- 20.0.24 .INDENT 0.0 .IP \(bu 2 Ensure that the seeded packages do not get too much out of date: .INDENT 2.0 .IP \(bu 2 add a CLI flag that triggers upgrade of embedded wheels under \fI\%upgrade\-embed\-wheels\fP .IP \(bu 2 periodically (once every 14 days) upgrade the embedded wheels in a background process, and use them if they have been released for more than 28 days (can be disabled via \fI\%no\-periodic\-update\fP) .UNINDENT .sp More details under \fI\%Wheels\fP \- by \X'tty: link https://github.com/gaborbernat'\fI\%@gaborbernat\fP\X'tty: link'\&. (\X'tty: link https://github.com/pypa/virtualenv/issues/1821'\fI\%#1821\fP\X'tty: link') .IP \(bu 2 Upgrade embed wheel content: .INDENT 2.0 .IP \(bu 2 ship wheels for Python \fB3.9\fP and \fB3.10\fP .IP \(bu 2 upgrade setuptools for Python \fB3.5+\fP from \fB47.1.1\fP to \fB47.3.1\fP .UNINDENT .sp by \X'tty: link https://github.com/gaborbernat'\fI\%@gaborbernat\fP\X'tty: link'\&. (\X'tty: link https://github.com/pypa/virtualenv/issues/1841'\fI\%#1841\fP\X'tty: link') .IP \(bu 2 Display the installed seed package versions in the final summary output, for example: .INDENT 2.0 .INDENT 3.5 .sp .EX 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 .EE .UNINDENT .UNINDENT .sp by \X'tty: link https://github.com/gaborbernat'\fI\%@gaborbernat\fP\X'tty: link'\&. (\X'tty: link https://github.com/pypa/virtualenv/issues/1864'\fI\%#1864\fP\X'tty: link') .UNINDENT .SS Bugfixes \- 20.0.24 .INDENT 0.0 .IP \(bu 2 Do not generate/overwrite \fB\&.gitignore\fP if it already exists at destination path \- by \X'tty: link https://github.com/gaborbernat'\fI\%@gaborbernat\fP\X'tty: link'\&. (\X'tty: link https://github.com/pypa/virtualenv/issues/1862'\fI\%#1862\fP\X'tty: link') .IP \(bu 2 Improve error message for no \fB\&.dist\-info\fP inside the \fBapp\-data\fP copy seeder \- by \X'tty: link https://github.com/gaborbernat'\fI\%@gaborbernat\fP\X'tty: link'\&. (\X'tty: link https://github.com/pypa/virtualenv/issues/1867'\fI\%#1867\fP\X'tty: link') .UNINDENT .SS Improved Documentation \- 20.0.24 .INDENT 0.0 .IP \(bu 2 How seeding mechanisms discover (and automatically keep it up to date) wheels at \fI\%Wheels\fP \- by \X'tty: link https://github.com/gaborbernat'\fI\%@gaborbernat\fP\X'tty: link'\&. (\X'tty: link https://github.com/pypa/virtualenv/issues/1821'\fI\%#1821\fP\X'tty: link') .IP \(bu 2 How distributions should handle shipping their own embedded wheels at \fI\%Embed wheels for distributions\fP \- by \X'tty: link https://github.com/gaborbernat'\fI\%@gaborbernat\fP\X'tty: link'\&. (\X'tty: link https://github.com/pypa/virtualenv/issues/1840'\fI\%#1840\fP\X'tty: link') .UNINDENT .SS v20.0.23 (2020\-06\-12) .SS Bugfixes \- 20.0.23 .INDENT 0.0 .IP \(bu 2 Fix typo in \fBsetup.cfg\fP \- by \X'tty: link https://github.com/RowdyHowell'\fI\%@RowdyHowell\fP\X'tty: link'\&. (\X'tty: link https://github.com/pypa/virtualenv/issues/1857'\fI\%#1857\fP\X'tty: link') .UNINDENT .SS v20.0.22 (2020\-06\-12) .SS Bugfixes \- 20.0.22 .INDENT 0.0 .IP \(bu 2 Relax \fBimportlib.resources\fP requirement to also allow version 2 \- by \X'tty: link https://github.com/asottile'\fI\%@asottile\fP\X'tty: link'\&. (\X'tty: link https://github.com/pypa/virtualenv/issues/1846'\fI\%#1846\fP\X'tty: link') .IP \(bu 2 Upgrade embedded setuptools to \fB44.1.1\fP for python 2 and \fB47.1.1\fP for python3.5+ \- by \X'tty: link https://github.com/gaborbernat'\fI\%@gaborbernat\fP\X'tty: link'\&. (\X'tty: link https://github.com/pypa/virtualenv/issues/1855'\fI\%#1855\fP\X'tty: link') .UNINDENT .SS v20.0.21 (2020\-05\-20) .SS Features \- 20.0.21 .INDENT 0.0 .IP \(bu 2 Generate ignore file for version control systems to avoid tracking virtual environments by default. Users should remove these files if still want to track. For now we support only \fBgit\fP by \X'tty: link https://github.com/gaborbernat'\fI\%@gaborbernat\fP\X'tty: link'\&. (\X'tty: link https://github.com/pypa/virtualenv/issues/1806'\fI\%#1806\fP\X'tty: link') .UNINDENT .SS Bugfixes \- 20.0.21 .INDENT 0.0 .IP \(bu 2 Fix virtualenv fails sometimes when run concurrently, \fB\-\-clear\-app\-data\fP conflicts with \fI\%clear\fP flag when abbreviation is turned on. To bypass this while allowing abbreviated flags on the command line we had to move it to \fI\%reset\-app\-data\fP \- by \X'tty: link https://github.com/gaborbernat'\fI\%@gaborbernat\fP\X'tty: link'\&. (\X'tty: link https://github.com/pypa/virtualenv/issues/1824'\fI\%#1824\fP\X'tty: link') .IP \(bu 2 Upgrade embedded \fBsetuptools\fP to \fB46.4.0\fP from \fB46.1.3\fP on Python \fB3.5+\fP, and \fBpip\fP from \fB20.1\fP to \fB20.1.1\fP \- by \X'tty: link https://github.com/gaborbernat'\fI\%@gaborbernat\fP\X'tty: link'\&. (\X'tty: link https://github.com/pypa/virtualenv/issues/1827'\fI\%#1827\fP\X'tty: link') .IP \(bu 2 Seeder pip now correctly handles \fB\-\-extra\-search\-dir\fP \- by \X'tty: link https://github.com/frenzymadness'\fI\%@frenzymadness\fP\X'tty: link'\&. (\X'tty: link https://github.com/pypa/virtualenv/issues/1834'\fI\%#1834\fP\X'tty: link') .UNINDENT .SS v20.0.20 (2020\-05\-04) .SS Bugfixes \- 20.0.20 .INDENT 0.0 .IP \(bu 2 Fix download fails with python 3.4 \- by \X'tty: link https://github.com/gaborbernat'\fI\%@gaborbernat\fP\X'tty: link'\&. (\X'tty: link https://github.com/pypa/virtualenv/issues/1809'\fI\%#1809\fP\X'tty: link') .IP \(bu 2 Fixes older CPython2 versions use \fB_get_makefile_filename\fP instead of \fBget_makefile_filename\fP on \fBsysconfig\fP \- by \X'tty: link https://github.com/ianw'\fI\%@ianw\fP\X'tty: link'\&. (\X'tty: link https://github.com/pypa/virtualenv/issues/1810'\fI\%#1810\fP\X'tty: link') .IP \(bu 2 Fix download is \fBTrue\fP by default \- by \X'tty: link https://github.com/gaborbernat'\fI\%@gaborbernat\fP\X'tty: link'\&. (\X'tty: link https://github.com/pypa/virtualenv/issues/1813'\fI\%#1813\fP\X'tty: link') .IP \(bu 2 Fail \fBapp\-data\fP seed operation when wheel download fails and better error message \- by \X'tty: link https://github.com/gaborbernat'\fI\%@gaborbernat\fP\X'tty: link'\&. (\X'tty: link https://github.com/pypa/virtualenv/issues/1814'\fI\%#1814\fP\X'tty: link') .UNINDENT .SS v20.0.19 (2020\-05\-03) .SS Bugfixes \- 20.0.19 .INDENT 0.0 .IP \(bu 2 Fix generating a Python 2 environment from Python 3 creates invalid python activator \- by \X'tty: link https://github.com/gaborbernat'\fI\%@gaborbernat\fP\X'tty: link'\&. (\X'tty: link https://github.com/pypa/virtualenv/issues/1776'\fI\%#1776\fP\X'tty: link') .IP \(bu 2 Fix pinning seed packages via \fBapp\-data\fP seeder raised \fBInvalid Requirement\fP \- by \X'tty: link https://github.com/gaborbernat'\fI\%@gaborbernat\fP\X'tty: link'\&. (\X'tty: link https://github.com/pypa/virtualenv/issues/1779'\fI\%#1779\fP\X'tty: link') .IP \(bu 2 Do not stop interpreter discovery if we fail to find the system interpreter for a executable during discovery \- by \X'tty: link https://github.com/gaborbernat'\fI\%@gaborbernat\fP\X'tty: link'\&. (\X'tty: link https://github.com/pypa/virtualenv/issues/1781'\fI\%#1781\fP\X'tty: link') .IP \(bu 2 On CPython2 POSIX platforms ensure \fBsyconfig.get_makefile_filename\fP exists within the virtual environment (this is used by some c\-extension based libraries \- e.g. numpy \- for building) \- by \X'tty: link https://github.com/gaborbernat'\fI\%@gaborbernat\fP\X'tty: link'\&. (\X'tty: link https://github.com/pypa/virtualenv/issues/1783'\fI\%#1783\fP\X'tty: link') .IP \(bu 2 Better handling of options \fI\%copies\fP and \fI\%symlinks\fP\&. Introduce priority of where the option is set to follow the order: CLI, env var, file, hardcoded. If both set at same level prefers copy over symlink. \- by \X'tty: link https://github.com/gaborbernat'\fI\%@gaborbernat\fP\X'tty: link'\&. (\X'tty: link https://github.com/pypa/virtualenv/issues/1784'\fI\%#1784\fP\X'tty: link') .IP \(bu 2 Upgrade pip for Python \fB2.7\fP and \fB3.5+\fP from \fB20.0.2\fP to \fB20.1\fP \- by \X'tty: link https://github.com/gaborbernat'\fI\%@gaborbernat\fP\X'tty: link'\&. (\X'tty: link https://github.com/pypa/virtualenv/issues/1793'\fI\%#1793\fP\X'tty: link') .IP \(bu 2 Fix CPython is not discovered from Windows registry, and discover pythons from Windows registry in decreasing order by version \- by \X'tty: link https://github.com/gaborbernat'\fI\%@gaborbernat\fP\X'tty: link'\&. (\X'tty: link https://github.com/pypa/virtualenv/issues/1796'\fI\%#1796\fP\X'tty: link') .IP \(bu 2 Fix symlink detection for creators \- by \X'tty: link https://github.com/asottile'\fI\%@asottile\fP\X'tty: link' (\X'tty: link https://github.com/pypa/virtualenv/issues/1803'\fI\%#1803\fP\X'tty: link') .UNINDENT .SS v20.0.18 (2020\-04\-16) .SS Bugfixes \- 20.0.18 .INDENT 0.0 .IP \(bu 2 Importing setuptools before cli_run could cause our python information query to fail due to setuptools patching \fBdistutils.dist.Distribution\fP \- by \X'tty: link https://github.com/gaborbernat'\fI\%@gaborbernat\fP\X'tty: link'\&. (\X'tty: link https://github.com/pypa/virtualenv/issues/1771'\fI\%#1771\fP\X'tty: link') .UNINDENT .SS v20.0.17 (2020\-04\-09) .SS Features \- 20.0.17 .INDENT 0.0 .IP \(bu 2 Extend environment variables checked for configuration to also check aliases (e.g. setting either \fBVIRTUALENV_COPIES\fP or \fBVIRTUALENV_ALWAYS_COPY\fP will work) \- by \X'tty: link https://github.com/gaborbernat'\fI\%@gaborbernat\fP\X'tty: link'\&. (\X'tty: link https://github.com/pypa/virtualenv/issues/1763'\fI\%#1763\fP\X'tty: link') .UNINDENT .SS v20.0.16 (2020\-04\-04) .SS Bugfixes \- 20.0.16 .INDENT 0.0 .IP \(bu 2 Allow seed wheel files inside the \fI\%extra\-search\-dir\fP folders that do not have \fBRequires\-Python\fP metadata specified, these are considered compatible with all python versions \- by \X'tty: link https://github.com/gaborbernat'\fI\%@gaborbernat\fP\X'tty: link'\&. (\X'tty: link https://github.com/pypa/virtualenv/issues/1757'\fI\%#1757\fP\X'tty: link') .UNINDENT .SS v20.0.15 (2020\-03\-27) .SS Features \- 20.0.15 .INDENT 0.0 .IP \(bu 2 Upgrade embedded setuptools to \fB46.1.3\fP from \fB46.1.1\fP \- by \X'tty: link https://github.com/gaborbernat'\fI\%@gaborbernat\fP\X'tty: link'\&. (\X'tty: link https://github.com/pypa/virtualenv/issues/1752'\fI\%#1752\fP\X'tty: link') .UNINDENT .SS v20.0.14 (2020\-03\-25) .SS Features \- 20.0.14 .INDENT 0.0 .IP \(bu 2 Remove \fB__PYVENV_LAUNCHER__\fP on macOs for Python \fB3.7.(<8)\fP and \fB3.8.(<3)\fP on interpreter startup via \fBpth\fP file, this pulls in the \X'tty: link https://github.com/python/cpython/pull/9516'\fI\%upstream patch\fP\X'tty: link' \- by \X'tty: link https://github.com/gaborbernat'\fI\%@gaborbernat\fP\X'tty: link'\&. (\X'tty: link https://github.com/pypa/virtualenv/issues/1704'\fI\%#1704\fP\X'tty: link') .IP \(bu 2 Upgrade embedded setuptools for Python \fB3.5+\fP to \fB46.1.1\fP, for Python \fB2.7\fP to \fB44.1.0\fP \- by \X'tty: link https://github.com/gaborbernat'\fI\%@gaborbernat\fP\X'tty: link'\&. (\X'tty: link https://github.com/pypa/virtualenv/issues/1745'\fI\%#1745\fP\X'tty: link') .UNINDENT .SS Bugfixes \- 20.0.14 .INDENT 0.0 .IP \(bu 2 Fix discovery of interpreter by name from \fBPATH\fP that does not match a spec format \- by \X'tty: link https://github.com/gaborbernat'\fI\%@gaborbernat\fP\X'tty: link'\&. (\X'tty: link https://github.com/pypa/virtualenv/issues/1746'\fI\%#1746\fP\X'tty: link') .UNINDENT .SS v20.0.13 (2020\-03\-19) .SS Bugfixes \- 20.0.13 .INDENT 0.0 .IP \(bu 2 Do not fail when the pyc files is missing for the host Python 2 \- by \X'tty: link https://github.com/gaborbernat'\fI\%@gaborbernat\fP\X'tty: link'\&. (\X'tty: link https://github.com/pypa/virtualenv/issues/1738'\fI\%#1738\fP\X'tty: link') .IP \(bu 2 Support broken Packaging pythons that put the include headers under distutils pattern rather than sysconfig one \- by \X'tty: link https://github.com/gaborbernat'\fI\%@gaborbernat\fP\X'tty: link'\&. (\X'tty: link https://github.com/pypa/virtualenv/issues/1739'\fI\%#1739\fP\X'tty: link') .UNINDENT .SS v20.0.12 (2020\-03\-19) .SS Bugfixes \- 20.0.12 .INDENT 0.0 .IP \(bu 2 Fix relative path discovery of interpreters \- by \X'tty: link https://github.com/gaborbernat'\fI\%@gaborbernat\fP\X'tty: link'\&. (\X'tty: link https://github.com/pypa/virtualenv/issues/1734'\fI\%#1734\fP\X'tty: link') .UNINDENT .SS v20.0.11 (2020\-03\-18) .SS Features \- 20.0.11 .INDENT 0.0 .IP \(bu 2 Improve error message when the host python does not satisfy invariants needed to create virtual environments (now we print which host files are incompatible/missing and for which creators when no supported creator can be matched, however we found creators that can describe the given Python interpreter \- will still print no supported creator for Jython, however print exactly what host files do not allow creation of virtual environments in case of CPython/PyPy) \- by \X'tty: link https://github.com/gaborbernat'\fI\%@gaborbernat\fP\X'tty: link'\&. (\X'tty: link https://github.com/pypa/virtualenv/issues/1716'\fI\%#1716\fP\X'tty: link') .UNINDENT .SS Bugfixes \- 20.0.11 .INDENT 0.0 .IP \(bu 2 Support Python 3 Framework distributed via XCode in macOs Catalina and before \- by \X'tty: link https://github.com/gaborbernat'\fI\%@gaborbernat\fP\X'tty: link'\&. (\X'tty: link https://github.com/pypa/virtualenv/issues/1663'\fI\%#1663\fP\X'tty: link') .IP \(bu 2 Fix Windows Store Python support, do not allow creation via symlink as that\(aqs not going to work by design \- by \X'tty: link https://github.com/gaborbernat'\fI\%@gaborbernat\fP\X'tty: link'\&. (\X'tty: link https://github.com/pypa/virtualenv/issues/1709'\fI\%#1709\fP\X'tty: link') .IP \(bu 2 Fix \fBactivate_this.py\fP throws \fBAttributeError\fP on Windows when virtual environment was created via cross python mechanism \- by \X'tty: link https://github.com/gaborbernat'\fI\%@gaborbernat\fP\X'tty: link'\&. (\X'tty: link https://github.com/pypa/virtualenv/issues/1710'\fI\%#1710\fP\X'tty: link') .IP \(bu 2 Fix \fB\-\-no\-pip\fP, \fB\-\-no\-setuptools\fP, \fB\-\-no\-wheel\fP not being respected \- by \X'tty: link https://github.com/gaborbernat'\fI\%@gaborbernat\fP\X'tty: link'\&. (\X'tty: link https://github.com/pypa/virtualenv/issues/1712'\fI\%#1712\fP\X'tty: link') .IP \(bu 2 Allow missing \fB\&.py\fP files if a compiled \fB\&.pyc\fP version is available \- by \X'tty: link https://github.com/tucked'\fI\%@tucked\fP\X'tty: link'\&. (\X'tty: link https://github.com/pypa/virtualenv/issues/1714'\fI\%#1714\fP\X'tty: link') .IP \(bu 2 Do not fail if the distutils/setuptools patch happens on a C\-extension loader (such as \fBzipimporter\fP on Python 3.7 or earlier) \- by \X'tty: link https://github.com/gaborbernat'\fI\%@gaborbernat\fP\X'tty: link'\&. (\X'tty: link https://github.com/pypa/virtualenv/issues/1715'\fI\%#1715\fP\X'tty: link') .IP \(bu 2 Support Python 2 implementations that require the landmark files and \fBsite.py\fP to be in platform standard library instead of the standard library path of the virtual environment (notably some RHEL ones, such as the Docker image \fBamazonlinux:1\fP) \- by \X'tty: link https://github.com/gaborbernat'\fI\%@gaborbernat\fP\X'tty: link'\&. (\X'tty: link https://github.com/pypa/virtualenv/issues/1719'\fI\%#1719\fP\X'tty: link') .IP \(bu 2 Allow the test suite to pass even when called with the system Python \- to help repackaging of the tool for Linux distributions \- by \X'tty: link https://github.com/gaborbernat'\fI\%@gaborbernat\fP\X'tty: link'\&. (\X'tty: link https://github.com/pypa/virtualenv/issues/1721'\fI\%#1721\fP\X'tty: link') .IP \(bu 2 Also generate \fBpipx.y\fP console script beside \fBpip\-x.y\fP to be compatible with how pip installs itself \- by \X'tty: link https://github.com/gaborbernat'\fI\%@gaborbernat\fP\X'tty: link'\&. (\X'tty: link https://github.com/pypa/virtualenv/issues/1723'\fI\%#1723\fP\X'tty: link') .IP \(bu 2 Automatically create the application data folder if it does not exists \- by \X'tty: link https://github.com/gaborbernat'\fI\%@gaborbernat\fP\X'tty: link'\&. (\X'tty: link https://github.com/pypa/virtualenv/issues/1728'\fI\%#1728\fP\X'tty: link') .UNINDENT .SS Improved Documentation \- 20.0.11 .INDENT 0.0 .IP \(bu 2 \fI\%supports\fP details now explicitly what Python installations we support \- by \X'tty: link https://github.com/gaborbernat'\fI\%@gaborbernat\fP\X'tty: link'\&. (\X'tty: link https://github.com/pypa/virtualenv/issues/1714'\fI\%#1714\fP\X'tty: link') .UNINDENT .SS v20.0.10 (2020\-03\-10) .SS Bugfixes \- 20.0.10 .INDENT 0.0 .IP \(bu 2 Fix acquiring python information might be altered by distutils configuration files generating incorrect layout virtual environments \- by \X'tty: link https://github.com/gaborbernat'\fI\%@gaborbernat\fP\X'tty: link'\&. (\X'tty: link https://github.com/pypa/virtualenv/issues/1663'\fI\%#1663\fP\X'tty: link') .IP \(bu 2 Upgrade embedded setuptools to \fB46.0.0\fP from \fB45.3.0\fP on Python \fB3.5+\fP \- by \X'tty: link https://github.com/gaborbernat'\fI\%@gaborbernat\fP\X'tty: link'\&. (\X'tty: link https://github.com/pypa/virtualenv/issues/1702'\fI\%#1702\fP\X'tty: link') .UNINDENT .SS Improved Documentation \- 20.0.10 .INDENT 0.0 .IP \(bu 2 Document requirements (pip + index server) when installing via pip under the installation section \- by \X'tty: link https://github.com/gaborbernat'\fI\%@gaborbernat\fP\X'tty: link'\&. (\X'tty: link https://github.com/pypa/virtualenv/issues/1618'\fI\%#1618\fP\X'tty: link') .IP \(bu 2 Document installing from non PEP\-518 systems \- \X'tty: link https://github.com/gaborbernat'\fI\%@gaborbernat\fP\X'tty: link'\&. (\X'tty: link https://github.com/pypa/virtualenv/issues/1619'\fI\%#1619\fP\X'tty: link') .IP \(bu 2 Document installing latest unreleased version from Github \- \X'tty: link https://github.com/gaborbernat'\fI\%@gaborbernat\fP\X'tty: link'\&. (\X'tty: link https://github.com/pypa/virtualenv/issues/1620'\fI\%#1620\fP\X'tty: link') .UNINDENT .SS v20.0.9 (2020\-03\-08) .SS Bugfixes \- 20.0.9 .INDENT 0.0 .IP \(bu 2 \fBpythonw.exe\fP works as \fBpython.exe\fP on Windows \- by \X'tty: link https://github.com/gaborbernat'\fI\%@gaborbernat\fP\X'tty: link'\&. (\X'tty: link https://github.com/pypa/virtualenv/issues/1686'\fI\%#1686\fP\X'tty: link') .IP \(bu 2 Handle legacy loaders for virtualenv import hooks used to patch distutils configuration load \- by \X'tty: link https://github.com/gaborbernat'\fI\%@gaborbernat\fP\X'tty: link'\&. (\X'tty: link https://github.com/pypa/virtualenv/issues/1690'\fI\%#1690\fP\X'tty: link') .IP \(bu 2 Support for python 2 platforms that store landmark files in \fBplatstdlib\fP over \fBstdlib\fP (e.g. RHEL) \- by \X'tty: link https://github.com/gaborbernat'\fI\%@gaborbernat\fP\X'tty: link'\&. (\X'tty: link https://github.com/pypa/virtualenv/issues/1694'\fI\%#1694\fP\X'tty: link') .IP \(bu 2 Upgrade embedded setuptools to \fB45.3.0\fP from \fB45.2.0\fP for Python \fB3.5+\fP \- by \X'tty: link https://github.com/gaborbernat'\fI\%@gaborbernat\fP\X'tty: link'\&. (\X'tty: link https://github.com/pypa/virtualenv/issues/1699'\fI\%#1699\fP\X'tty: link') .UNINDENT .SS v20.0.8 (2020\-03\-04) .SS Bugfixes \- 20.0.8 .INDENT 0.0 .IP \(bu 2 Having \X'tty: link https://docs.python.org/3/install/index.html#distutils-configuration-files'\fI\%distutils configuration\fP\X'tty: link' files that set \fBprefix\fP and \fBinstall_scripts\fP cause installation of packages in the wrong location \- by \X'tty: link https://github.com/gaborbernat'\fI\%@gaborbernat\fP\X'tty: link'\&. (\X'tty: link https://github.com/pypa/virtualenv/issues/1663'\fI\%#1663\fP\X'tty: link') .IP \(bu 2 Fix \fBPYTHONPATH\fP being overridden on Python 2 — by \X'tty: link https://github.com/jd'\fI\%@jd\fP\X'tty: link'\&. (\X'tty: link https://github.com/pypa/virtualenv/issues/1673'\fI\%#1673\fP\X'tty: link') .IP \(bu 2 Fix list configuration value parsing from config file or environment variable \- by \X'tty: link https://github.com/gaborbernat'\fI\%@gaborbernat\fP\X'tty: link'\&. (\X'tty: link https://github.com/pypa/virtualenv/issues/1674'\fI\%#1674\fP\X'tty: link') .IP \(bu 2 Fix Batch activation script shell prompt to display environment name by default \- by \X'tty: link https://github.com/spetafree'\fI\%@spetafree\fP\X'tty: link'\&. (\X'tty: link https://github.com/pypa/virtualenv/issues/1679'\fI\%#1679\fP\X'tty: link') .IP \(bu 2 Fix startup on Python 2 is slower for virtualenv \- this was due to setuptools calculating it\(aqs working set distribution \- by \X'tty: link https://github.com/gaborbernat'\fI\%@gaborbernat\fP\X'tty: link'\&. (\X'tty: link https://github.com/pypa/virtualenv/issues/1682'\fI\%#1682\fP\X'tty: link') .IP \(bu 2 Fix entry points are not populated for editable installs on Python 2 due to setuptools working set being calculated before \fBeasy_install.pth\fP runs \- by \X'tty: link https://github.com/gaborbernat'\fI\%@gaborbernat\fP\X'tty: link'\&. (\X'tty: link https://github.com/pypa/virtualenv/issues/1684'\fI\%#1684\fP\X'tty: link') .IP \(bu 2 Fix \fBattr:\fP import fails for setuptools \- by \X'tty: link https://github.com/gaborbernat'\fI\%@gaborbernat\fP\X'tty: link'\&. (\X'tty: link https://github.com/pypa/virtualenv/issues/1685'\fI\%#1685\fP\X'tty: link') .UNINDENT .SS v20.0.7 (2020\-02\-26) .SS Bugfixes \- 20.0.7 .INDENT 0.0 .IP \(bu 2 Disable distutils fixup for python 3 until \X'tty: link https://github.com/pypa/pip/issues/7778'\fI\%pypa/pip #7778\fP\X'tty: link' is fixed and released \- by \X'tty: link https://github.com/gaborbernat'\fI\%@gaborbernat\fP\X'tty: link'\&. (\X'tty: link https://github.com/pypa/virtualenv/issues/1669'\fI\%#1669\fP\X'tty: link') .UNINDENT .SS v20.0.6 (2020\-02\-26) .SS Bugfixes \- 20.0.6 .INDENT 0.0 .IP \(bu 2 Fix global site package always being added with bundled macOs python framework builds \- by \X'tty: link https://github.com/gaborbernat'\fI\%@gaborbernat\fP\X'tty: link'\&. (\X'tty: link https://github.com/pypa/virtualenv/issues/1561'\fI\%#1561\fP\X'tty: link') .IP \(bu 2 Fix generated scripts use host version info rather than target \- by \X'tty: link https://github.com/gaborbernat'\fI\%@gaborbernat\fP\X'tty: link'\&. (\X'tty: link https://github.com/pypa/virtualenv/issues/1600'\fI\%#1600\fP\X'tty: link') .IP \(bu 2 Fix circular prefix reference with single elements (accept these as if they were system executables, print a info about them referencing themselves) \- by \X'tty: link https://github.com/gaborbernat'\fI\%@gaborbernat\fP\X'tty: link'\&. (\X'tty: link https://github.com/pypa/virtualenv/issues/1632'\fI\%#1632\fP\X'tty: link') .IP \(bu 2 Handle the case when the application data folder is read\-only: .INDENT 2.0 .IP \(bu 2 the application data folder is now controllable via \fI\%app\-data\fP, .IP \(bu 2 \fBclear\-app\-data\fP now cleans the entire application data folder, not just the \fBapp\-data\fP seeder path, .IP \(bu 2 check if the application data path passed in does not exist or is read\-only, and fallback to a temporary directory, .IP \(bu 2 temporary directory application data is automatically cleaned up at the end of execution, .IP \(bu 2 \fI\%symlink\-app\-data\fP is always \fBFalse\fP when the application data is temporary .UNINDENT .sp by \X'tty: link https://github.com/gaborbernat'\fI\%@gaborbernat\fP\X'tty: link'\&. (\X'tty: link https://github.com/pypa/virtualenv/issues/1640'\fI\%#1640\fP\X'tty: link') .IP \(bu 2 Fix PyPy 2 builtin modules are imported from standard library, rather than from builtin \- by \X'tty: link https://github.com/gaborbernat'\fI\%@gaborbernat\fP\X'tty: link'\&. (\X'tty: link https://github.com/pypa/virtualenv/issues/1652'\fI\%#1652\fP\X'tty: link') .IP \(bu 2 Fix creation of entry points when path contains spaces \- by \X'tty: link https://github.com/nsoranzo'\fI\%@nsoranzo\fP\X'tty: link'\&. (\X'tty: link https://github.com/pypa/virtualenv/issues/1660'\fI\%#1660\fP\X'tty: link') .IP \(bu 2 Fix relative paths for the zipapp (for python \fB3.7+\fP) \- by \X'tty: link https://github.com/gaborbernat'\fI\%@gaborbernat\fP\X'tty: link'\&. (\X'tty: link https://github.com/pypa/virtualenv/issues/1666'\fI\%#1666\fP\X'tty: link') .UNINDENT .SS v20.0.5 (2020\-02\-21) .SS Features \- 20.0.5 .INDENT 0.0 .IP \(bu 2 Also create \fBpythonX.X\fP executables when creating pypy virtualenvs \- by \X'tty: link https://github.com/asottile'\fI\%@asottile\fP\X'tty: link' (\X'tty: link https://github.com/pypa/virtualenv/issues/1612'\fI\%#1612\fP\X'tty: link') .IP \(bu 2 Fail with better error message if trying to install source with unsupported \fBsetuptools\fP, allow \fBsetuptools\-scm >= 2\fP and move to legacy \fBsetuptools\-scm\fP format to support better older platforms (\fBCentOS 7\fP and such) \- by \X'tty: link https://github.com/gaborbernat'\fI\%@gaborbernat\fP\X'tty: link'\&. (\X'tty: link https://github.com/pypa/virtualenv/issues/1621'\fI\%#1621\fP\X'tty: link') .IP \(bu 2 Report of the created virtual environment is now split across four short lines rather than one long \- by \X'tty: link https://github.com/gaborbernat'\fI\%@gaborbernat\fP\X'tty: link' (\X'tty: link https://github.com/pypa/virtualenv/issues/1641'\fI\%#1641\fP\X'tty: link') .UNINDENT .SS Bugfixes \- 20.0.5 .INDENT 0.0 .IP \(bu 2 Add macOs Python 2 Framework support (now we test it with the CI via brew) \- by \X'tty: link https://github.com/gaborbernat'\fI\%@gaborbernat\fP\X'tty: link' (\X'tty: link https://github.com/pypa/virtualenv/issues/1561'\fI\%#1561\fP\X'tty: link') .IP \(bu 2 Fix losing of libpypy\-c.so when the pypy executable is a symlink \- by \X'tty: link https://github.com/asottile'\fI\%@asottile\fP\X'tty: link' (\X'tty: link https://github.com/pypa/virtualenv/issues/1614'\fI\%#1614\fP\X'tty: link') .IP \(bu 2 Discover python interpreter in a case insensitive manner \- by \X'tty: link https://github.com/PrajwalM2212'\fI\%@PrajwalM2212\fP\X'tty: link' (\X'tty: link https://github.com/pypa/virtualenv/issues/1624'\fI\%#1624\fP\X'tty: link') .IP \(bu 2 Fix cross interpreter support when the host python sets \fBsys.base_executable\fP based on \fB__PYVENV_LAUNCHER__\fP \- by \X'tty: link https://github.com/cjolowicz'\fI\%@cjolowicz\fP\X'tty: link' (\X'tty: link https://github.com/pypa/virtualenv/issues/1643'\fI\%#1643\fP\X'tty: link') .UNINDENT .SS v20.0.4 (2020\-02\-14) .SS Features \- 20.0.4 .INDENT 0.0 .IP \(bu 2 When aliasing interpreters, use relative symlinks \- by \X'tty: link https://github.com/asottile'\fI\%@asottile\fP\X'tty: link'\&. (\X'tty: link https://github.com/pypa/virtualenv/issues/1596'\fI\%#1596\fP\X'tty: link') .UNINDENT .SS Bugfixes \- 20.0.4 .INDENT 0.0 .IP \(bu 2 Allow the use of \fB/\fP as pathname component separator on Windows \- by \fBvphilippon\fP (\X'tty: link https://github.com/pypa/virtualenv/issues/1582'\fI\%#1582\fP\X'tty: link') .IP \(bu 2 Lower minimal version of six required to 1.9 \- by \fBssbarnea\fP (\X'tty: link https://github.com/pypa/virtualenv/issues/1606'\fI\%#1606\fP\X'tty: link') .UNINDENT .SS v20.0.3 (2020\-02\-12) .SS Bugfixes \- 20.0.3 .INDENT 0.0 .IP \(bu 2 On Python 2 with Apple Framework builds the global site package is no longer added when the \fI\%system\-site\-packages\fP is not specified \- by \X'tty: link https://github.com/gaborbernat'\fI\%@gaborbernat\fP\X'tty: link'\&. (\X'tty: link https://github.com/pypa/virtualenv/issues/1561'\fI\%#1561\fP\X'tty: link') .IP \(bu 2 Fix system python discovery mechanism when prefixes contain relative parts (e.g. \fB\&..\fP) by resolving paths within the python information query \- by \X'tty: link https://github.com/gaborbernat'\fI\%@gaborbernat\fP\X'tty: link'\&. (\X'tty: link https://github.com/pypa/virtualenv/issues/1583'\fI\%#1583\fP\X'tty: link') .IP \(bu 2 Expose a programmatic API as \fBfrom virtualenv import cli_run\fP \- by \X'tty: link https://github.com/gaborbernat'\fI\%@gaborbernat\fP\X'tty: link'\&. (\X'tty: link https://github.com/pypa/virtualenv/issues/1585'\fI\%#1585\fP\X'tty: link') .IP \(bu 2 Fix \fBapp\-data\fP \fI\%seeder\fP injects a extra \fB\&.dist\-info.virtualenv\fP path that breaks \fBimportlib.metadata\fP, now we inject an extra \fB\&.virtualenv\fP \- by \X'tty: link https://github.com/gaborbernat'\fI\%@gaborbernat\fP\X'tty: link'\&. (\X'tty: link https://github.com/pypa/virtualenv/issues/1589'\fI\%#1589\fP\X'tty: link') .UNINDENT .SS Improved Documentation \- 20.0.3 .INDENT 0.0 .IP \(bu 2 Document a programmatic API as \fBfrom virtualenv import cli_run\fP under \fI\%Programmatic API\fP \- by \X'tty: link https://github.com/gaborbernat'\fI\%@gaborbernat\fP\X'tty: link'\&. (\X'tty: link https://github.com/pypa/virtualenv/issues/1585'\fI\%#1585\fP\X'tty: link') .UNINDENT .SS v20.0.2 (2020\-02\-11) .SS Features \- 20.0.2 .INDENT 0.0 .IP \(bu 2 Print out a one line message about the created virtual environment when no \fI\%verbose\fP is set, this can now be silenced to get back the original behavior via the \fI\%quiet\fP flag \- by \X'tty: link https://github.com/pradyunsg'\fI\%@pradyunsg\fP\X'tty: link'\&. (\X'tty: link https://github.com/pypa/virtualenv/issues/1557'\fI\%#1557\fP\X'tty: link') .IP \(bu 2 Allow virtualenv\(aqs app data cache to be overridden by \fBVIRTUALENV_OVERRIDE_APP_DATA\fP \- by \X'tty: link https://github.com/asottile'\fI\%@asottile\fP\X'tty: link'\&. (\X'tty: link https://github.com/pypa/virtualenv/issues/1559'\fI\%#1559\fP\X'tty: link') .IP \(bu 2 Passing in the virtual environment name/path is now required (no longer defaults to \fBvenv\fP) \- by \X'tty: link https://github.com/gaborbernat'\fI\%@gaborbernat\fP\X'tty: link'\&. (\X'tty: link https://github.com/pypa/virtualenv/issues/1568'\fI\%#1568\fP\X'tty: link') .IP \(bu 2 Add a CLI flag \fI\%with\-traceback\fP that allows displaying the stacktrace of the virtualenv when a failure occurs \- by \X'tty: link https://github.com/gaborbernat'\fI\%@gaborbernat\fP\X'tty: link'\&. (\X'tty: link https://github.com/pypa/virtualenv/issues/1572'\fI\%#1572\fP\X'tty: link') .UNINDENT .SS Bugfixes \- 20.0.2 .INDENT 0.0 .IP \(bu 2 Support long path names for generated virtual environment console entry points (such as \fBpip\fP) when using the \fBapp\-data\fP \fI\%seeder\fP \- by \X'tty: link https://github.com/gaborbernat'\fI\%@gaborbernat\fP\X'tty: link'\&. (\X'tty: link https://github.com/pypa/virtualenv/issues/997'\fI\%#997\fP\X'tty: link') .IP \(bu 2 Improve python discovery mechanism: .INDENT 2.0 .IP \(bu 2 do not fail if there are executables that fail to query (e.g. for not having execute access to it) on the \fBPATH\fP, .IP \(bu 2 beside the prefix folder also try with the platform dependent binary folder within that, .UNINDENT .sp by \X'tty: link https://github.com/gaborbernat'\fI\%@gaborbernat\fP\X'tty: link'\&. (\X'tty: link https://github.com/pypa/virtualenv/issues/1545'\fI\%#1545\fP\X'tty: link') .IP \(bu 2 When copying (either files or trees) do not copy the permission bits, last access time, last modification time, and flags as access to these might be forbidden (for example in case of the macOs Framework Python) and these are not needed for the user to use the virtual environment \- by \X'tty: link https://github.com/gaborbernat'\fI\%@gaborbernat\fP\X'tty: link'\&. (\X'tty: link https://github.com/pypa/virtualenv/issues/1561'\fI\%#1561\fP\X'tty: link') .IP \(bu 2 While discovering a python executables interpreters that cannot be queried are now displayed with info level rather than warning, so now they\(aqre no longer shown by default (these can be just executables to which we don\(aqt have access or that are broken, don\(aqt warn if it\(aqs not the target Python we want) \- by \X'tty: link https://github.com/gaborbernat'\fI\%@gaborbernat\fP\X'tty: link'\&. (\X'tty: link https://github.com/pypa/virtualenv/issues/1574'\fI\%#1574\fP\X'tty: link') .IP \(bu 2 The \fBapp\-data\fP \fI\%seeder\fP no longer symlinks the packages on UNIX and copies on Windows. Instead by default always copies, however now has the \fI\%symlink\-app\-data\fP flag allowing users to request this less robust but faster method \- by \X'tty: link https://github.com/gaborbernat'\fI\%@gaborbernat\fP\X'tty: link'\&. (\X'tty: link https://github.com/pypa/virtualenv/issues/1575'\fI\%#1575\fP\X'tty: link') .UNINDENT .SS Improved Documentation \- 20.0.2 .INDENT 0.0 .IP \(bu 2 Add link to the \X'tty: link https://virtualenv.pypa.io/en/legacy'\fI\%legacy documentation\fP\X'tty: link' for the changelog by \X'tty: link https://github.com/jezdez'\fI\%@jezdez\fP\X'tty: link'\&. (\X'tty: link https://github.com/pypa/virtualenv/issues/1547'\fI\%#1547\fP\X'tty: link') .IP \(bu 2 Fine tune the documentation layout: default width of theme, allow tables to wrap around, soft corners for code snippets \- by \X'tty: link https://github.com/pradyunsg'\fI\%@pradyunsg\fP\X'tty: link'\&. (\X'tty: link https://github.com/pypa/virtualenv/issues/1548'\fI\%#1548\fP\X'tty: link') .UNINDENT .SS v20.0.1 (2020\-02\-10) .SS Features \- 20.0.1 .INDENT 0.0 .IP \(bu 2 upgrade embedded setuptools to \fB45.2.0\fP from \fB45.1.0\fP for Python \fB3.4+\fP \- by \X'tty: link https://github.com/gaborbernat'\fI\%@gaborbernat\fP\X'tty: link'\&. (\X'tty: link https://github.com/pypa/virtualenv/issues/1554'\fI\%#1554\fP\X'tty: link') .UNINDENT .SS Bugfixes \- 20.0.1 .INDENT 0.0 .IP \(bu 2 Virtual environments created via relative path on Windows creates bad console executables \- by \X'tty: link https://github.com/gaborbernat'\fI\%@gaborbernat\fP\X'tty: link'\&. (\X'tty: link https://github.com/pypa/virtualenv/issues/1552'\fI\%#1552\fP\X'tty: link') .IP \(bu 2 Seems sometimes venvs created set their base executable to themselves; we accept these without question, so we handle virtual environments as system pythons causing issues \- by \X'tty: link https://github.com/gaborbernat'\fI\%@gaborbernat\fP\X'tty: link'\&. (\X'tty: link https://github.com/pypa/virtualenv/issues/1553'\fI\%#1553\fP\X'tty: link') .UNINDENT .SS v20.0.0. (2020\-02\-10) .SS Improved Documentation \- 20.0.0. .INDENT 0.0 .IP \(bu 2 Fixes typos, repeated words and inconsistent heading spacing. Rephrase parts of the development documentation and CLI documentation. Expands shorthands like \fBenv var\fP and \fBconfig\fP to their full forms. Uses descriptions from respective documentation, for projects listed in \fBrelated links\fP \- by \X'tty: link https://github.com/pradyunsg'\fI\%@pradyunsg\fP\X'tty: link'\&. (\X'tty: link https://github.com/pypa/virtualenv/issues/1540'\fI\%#1540\fP\X'tty: link') .UNINDENT .SS v20.0.0b2 (2020\-02\-04) .SS Features \- 20.0.0b2 .INDENT 0.0 .IP \(bu 2 Improve base executable discovery mechanism: .INDENT 2.0 .IP \(bu 2 print at debug level why we refuse some candidates, .IP \(bu 2 when no candidates match exactly, instead of hard failing fallback to the closest match where the priority of matching attributes is: python implementation, major version, minor version, architecture, patch version, release level and serial (this is to facilitate things to still work when the OS upgrade replace/upgrades the system python with a never version, than what the virtualenv host python was created with), .IP \(bu 2 always resolve system_executable information during the interpreter discovery, and the discovered environment is the system interpreter instead of the venv/virtualenv (this happened before lazily the first time we accessed, and caused reporting that the created virtual environment is of type of the virtualenv host python version, instead of the system pythons version \- these two can differ if the OS upgraded the system python underneath and the virtualenv host was created via copy), .UNINDENT .sp by \X'tty: link https://github.com/gaborbernat'\fI\%@gaborbernat\fP\X'tty: link'\&. (\X'tty: link https://github.com/pypa/virtualenv/issues/1515'\fI\%#1515\fP\X'tty: link') .IP \(bu 2 Generate \fBbash\fP and \fBfish\fP activators on Windows too (as these can be available with git bash, cygwin or mysys2) \- by \X'tty: link https://github.com/gaborbernat'\fI\%@gaborbernat\fP\X'tty: link'\&. (\X'tty: link https://github.com/pypa/virtualenv/issues/1527'\fI\%#1527\fP\X'tty: link') .IP \(bu 2 Upgrade the bundled \fBwheel\fP package from \fB0.34.0\fP to \fB0.34.2\fP \- by \X'tty: link https://github.com/gaborbernat'\fI\%@gaborbernat\fP\X'tty: link'\&. (\X'tty: link https://github.com/pypa/virtualenv/issues/1531'\fI\%#1531\fP\X'tty: link') .UNINDENT .SS Bugfixes \- 20.0.0b2 .INDENT 0.0 .IP \(bu 2 Bash activation script should have no extensions instead of \fB\&.sh\fP (this fixes the \X'tty: link https://pypi.org/project/virtualenvwrapper'\fI\%virtualenvwrapper\fP\X'tty: link' integration) \- by \X'tty: link https://github.com/gaborbernat'\fI\%@gaborbernat\fP\X'tty: link'\&. (\X'tty: link https://github.com/pypa/virtualenv/issues/1508'\fI\%#1508\fP\X'tty: link') .IP \(bu 2 Show less information when we run with a single verbosity (\fB\-v\fP): .INDENT 2.0 .IP \(bu 2 no longer shows accepted interpreters information (as the last proposed one is always the accepted one), .IP \(bu 2 do not display the \fBstr_spec\fP attribute for \fBPythonSpec\fP as these can be deduced from the other attributes, .IP \(bu 2 for the \fBapp\-data\fP seeder do not show the type of lock, only the path to the app data directory, .UNINDENT .sp By \X'tty: link https://github.com/gaborbernat'\fI\%@gaborbernat\fP\X'tty: link'\&. (\X'tty: link https://github.com/pypa/virtualenv/issues/1510'\fI\%#1510\fP\X'tty: link') .IP \(bu 2 Fixed cannot discover a python interpreter that has already been discovered under a different path (such is the case when we have multiple symlinks to the same interpreter) \- by \X'tty: link https://github.com/gaborbernat'\fI\%@gaborbernat\fP\X'tty: link'\&. (\X'tty: link https://github.com/pypa/virtualenv/issues/1512'\fI\%#1512\fP\X'tty: link') .IP \(bu 2 Support relative paths for \fB\-p\fP \- by \X'tty: link https://github.com/gaborbernat'\fI\%@gaborbernat\fP\X'tty: link'\&. (\X'tty: link https://github.com/pypa/virtualenv/issues/1514'\fI\%#1514\fP\X'tty: link') .IP \(bu 2 Creating virtual environments in parallel fail with cannot acquire lock within app data \- by \X'tty: link https://github.com/gaborbernat'\fI\%@gaborbernat\fP\X'tty: link'\&. (\X'tty: link https://github.com/pypa/virtualenv/issues/1516'\fI\%#1516\fP\X'tty: link') .IP \(bu 2 pth files were not processed under Debian CPython2 interpreters \- by \X'tty: link https://github.com/gaborbernat'\fI\%@gaborbernat\fP\X'tty: link'\&. (\X'tty: link https://github.com/pypa/virtualenv/issues/1517'\fI\%#1517\fP\X'tty: link') .IP \(bu 2 Fix prompt not displayed correctly with upcoming fish 3.10 due to us not preserving \fB$pipestatus\fP \- by \X'tty: link https://github.com/krobelus'\fI\%@krobelus\fP\X'tty: link'\&. (\X'tty: link https://github.com/pypa/virtualenv/issues/1530'\fI\%#1530\fP\X'tty: link') .IP \(bu 2 Stable order within \fBpyenv.cfg\fP and add \fBinclude\-system\-site\-packages\fP only for creators that reference a global Python \- by user:\fIgaborbernat\fP\&. (\X'tty: link https://github.com/pypa/virtualenv/issues/1535'\fI\%#1535\fP\X'tty: link') .UNINDENT .SS Improved Documentation \- 20.0.0b2 .INDENT 0.0 .IP \(bu 2 Create the first iteration of the new documentation \- by \X'tty: link https://github.com/gaborbernat'\fI\%@gaborbernat\fP\X'tty: link'\&. (\X'tty: link https://github.com/pypa/virtualenv/issues/1465'\fI\%#1465\fP\X'tty: link') .IP \(bu 2 Project readme is now of type MarkDown instead of reStructuredText \- by \X'tty: link https://github.com/gaborbernat'\fI\%@gaborbernat\fP\X'tty: link'\&. (\X'tty: link https://github.com/pypa/virtualenv/issues/1531'\fI\%#1531\fP\X'tty: link') .UNINDENT .SS v20.0.0b1 (2020\-01\-28) .INDENT 0.0 .IP \(bu 2 First public release of the rewrite. Everything is brand new and just added. .IP \(bu 2 \fB\-\-download\fP defaults to \fBFalse\fP .IP \(bu 2 No longer replaces builtin \fBsite\fP module with \X'tty: link https://github.com/pypa/virtualenv/blob/legacy/virtualenv_embedded/site.py'\fI\%custom version baked within virtualenv code itself\fP\X'tty: link'\&. A simple shim module is used to fix up things on Python 2 only. .UNINDENT .sp \fBWARNING:\fP .INDENT 0.0 .INDENT 3.5 The current virtualenv is the second iteration of implementation. From version \fB0.8\fP all the way to \fB16.7.9\fP we numbered the first iteration. Version \fB20.0.0b1\fP is a complete rewrite of the package, and as such this release history starts from there. The old changelog is still available in the \X'tty: link https://virtualenv.pypa.io/en/legacy/changes.html'\fI\%legacy branch documentation\fP\X'tty: link'\&. .UNINDENT .UNINDENT .SH AUTHOR Author name not set .SH COPYRIGHT 2007-2024, PyPA, PyPA .\" Generated by docutils manpage writer. .