Skip to content Skip to sidebar Skip to footer

Control The Pip Version In Virtualenv

How do I control the version of pip which is used in a freshly created venv? By default, it uses a vendored pip distribution which may be out of date or unsuitable for whatever oth

Solution 1:

For me, I just upgraded pip/virtualenv/virtualenvwrapper on my machine (not inside the virtualenv). Subsequently created virtualenvs had the updated version.

deactivate
pip install --upgrade pip virtualenv virtualenvwrapper
mkvirtualenv ...

Solution 2:

From reading the source of virtualenv, it looks like pip is installed from a source tarfile included with virtualenv. In virtualenv 1.10.1, it is pip-1.4.1.tar.gz in the site-packages/virtualenv_support directory (it gets setuptools from the same place). You could feasibly replace that archive to control the version; virtualenv.py, at least the version I have, doesn't care which version of pip is there:

    if not no_pip:
        install_sdist('Pip', 'pip-*.tar.gz', py_executable, search_dirs)

You could also pass the --no-pip option and then install the version you want from source.

In virtualenv 1.11, it looks for a wheel file (e.g. pip-*.whl) instead of a tar.gz, but other than that it acts the same way (thanks @wim for the update).


Solution 3:

You cannot downgrade pip using pip, the solution is to install a specific version in your virtual environment:

virtualenv env -p python3.6 --no-pip
source env/bin/activate
curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py
python get-pip.py pip==18.1

This will allow you to keep using --process-dependency-links that was removed in pip 19.


Solution 4:

It's easy enough to replace the pip that gets installed in your virtual environment. Within your virtual environment active, simply execute the following command:

pip install pip==1.4.1

Solution 5:

A new addition to the stdlib venv module is EnvBuilder.upgrade_dependencies. However, it didn't make it into the venv command-line interface in time for the 3.8.0 release.

Unfortunately, it won't really help users to install a specific pip version, only the latest.

All is not lost! The venv CLI does provide a --without-pip argument that is useful here. You can use this to opt-out of the vendored pip, and then actually use the vendored pip wheel to install your desired pip version instead (along with any other packages you might want in a freshly created virtual environment). This is all a bit convoluted, so best to put it into a shell function - this goes into your shell profile or rc file:

function ve() {
    local py="python3"
    if [ ! -d ./.venv ]; then
        echo "creating venv..."
        if ! $py -m venv .venv --prompt=$(basename $PWD) --without-pip; then
            echo "ERROR: Problem creating venv" >&2
            return 1
        else
            local whl=$($py -c "import pathlib, ensurepip; [whl] = pathlib.Path(ensurepip.__path__[0]).glob('_bundled/pip*.whl'); print(whl)")
            echo "boostrapping pip using $whl"
            .venv/bin/python $whl/pip install --upgrade pip setuptools wheel
            source .venv/bin/activate
        fi
    else
        source .venv/bin/activate
    fi
}

As written, this function just pulls latest pip, setuptools, and wheel from index. To force specific versions you can just change this line of the shell script:

.venv/bin/python $whl/pip install --upgrade pip setuptools wheel

Into this, for example:

.venv/bin/python $whl/pip install pip==19.3.1

For Python 2.7 users, you may do a similar trick because virtualenv provides similar command-line options in --no-pip, --no-setuptools, and --no-wheel, and there is still a vendored pip wheel available to bootstrap since Python 2.7.9. Pathlib will not be available, so you'll need to change the pathlib usage into os.path + glob.


Post a Comment for "Control The Pip Version In Virtualenv"