Control the pip version in virtualenv

2020-05-20 04:25发布

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 other reason. I want to be able to create a venv with a user-specified version of pip installed initially, as opposed to creating one and then upgrading the pip installation from within the env.

5条回答
Melony?
2楼-- · 2020-05-20 04:58

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).

查看更多
可以哭但决不认输i
3楼-- · 2020-05-20 05:03

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.

查看更多
We Are One
4楼-- · 2020-05-20 05:06

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
查看更多
ら.Afraid
5楼-- · 2020-05-20 05:10

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.

查看更多
家丑人穷心不美
6楼-- · 2020-05-20 05:14

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 ...
查看更多
登录 后发表回答