Control the pip version in virtualenv

≡放荡痞女 提交于 2020-01-22 05:56:04

问题


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.


回答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 ...



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




回答3:


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



回答4:


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.




回答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.



来源:https://stackoverflow.com/questions/21099057/control-the-pip-version-in-virtualenv

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!