控制virtualenv中的pip版本

时间:2014-01-13 18:53:20

标签: python pip virtualenv virtualenvwrapper python-wheel

如何控制在新创建的virtualenv中使用的pip版本?我相信我已经从操作系统中消除了所有其他版本的pip,但仍然mkvirtualenv从某个地方获得了一个pip-1.5!我希望它在virtualenv中使用pip 1.4.1。

$ which pip
/usr/local/bin/pip
$ pip --version
pip 1.4.1 from /usr/local/lib/python2.7/dist-packages/pip-1.4.1-py2.7.egg (python 2.7)
$ pip install virtualenv virtualenvwrapper
    <snip...>    
Successfully installed virtualenv virtualenvwrapper
Cleaning up...
$ source ~/.bashrc
$ mkvirtualenv spam
New python executable in spam/bin/python
Installing setuptools, pip...done.
(spam)$ which pip
/home/wim/.virtualenvs/spam/bin/pip
(spam)$ pip --version
pip 1.5 from /home/wim/.virtualenvs/spam/local/lib/python2.7/site-packages (python 2.7)

6 个答案:

答案 0 :(得分:15)

对我来说,我刚刚在我的机器上升级了pip / virtualenv / virtualenvwrapper(不在virtualenv中)。随后创建的virtualenvs有更新版本。

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

答案 1 :(得分:13)

从阅读virtualenv的源代码看,pip是从virtualenv附带的源tarfile安装的。在virtualenv 1.10.1中,pip-1.4.1.tar.gz目录中的site-packages/virtualenv_support(它从同一个地方得到setuptools)。您可以切实地替换该存档来控制版本; virtualenv.py,至少我的版本,并不关心那个版本的pip:

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

您也可以传递--no-pip选项,然后从源代码安装所需的版本。

在virtualenv 1.11中,它查找一个轮文件(例如pip-*.whl)而不是tar.gz,但除此之外它的行为方式相同(感谢@wim进行更新)。

答案 2 :(得分:4)

更换虚拟环境中安装的点很容易。在您的虚拟环境中,只需执行以下命令:

pip install pip==1.4.1

答案 3 :(得分:1)

您不能使用pip 降级 pip,解决方案是在虚拟环境中安装特定版本:

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

这将允许您继续使用在第19点中删除的--process-dependency-links

答案 4 :(得分:1)

stdlib venv模块的新添加项是EnvBuilder.upgrade_dependencies。但是,对于3.8.0版本,它并没有及时进入venv命令行界面。

不幸的是,它并不能真正帮助用户安装特定于 的pip版本,只是最新版本。

一切都不会丢失! venv CLI确实提供了一个--without-pip参数,在这里很有用。您可以使用此选项退出供应商的pip,然后实际使用供应商的pip wheel来安装所需的pip版本(以及在刚创建的虚拟环境中可能需要的任何其他软件包)。这有点令人费解,因此最好将其放入shell函数中-将其放入您的shell配置文件或rc文件中:

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
}

按照编写,此函数仅从索引中提取最新的pipsetuptoolswheel。要强制使用特定版本,您只需更改以下shell脚本行即可:

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

例如,

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

对于Python 2.7用户,您可以做类似的技巧,因为virtualenv--no-pip--no-setuptools--no-wheel中提供了类似的命令行选项,并且仍然存在可用来引导since Python 2.7.9的供应点子轮。 Pathlib将不可用,因此您需要将pathlib的用法更改为os.path + glob

答案 5 :(得分:-1)

TLDR

python -m pip install --upgrade pip==<target version number>

示例

在虚拟环境中从 pip 20.3 降级到 pip 19.3

(env) $ pip --version
pip 20.3.1

(env) $ python -m pip install --upgrade pip==19.3          # downgrading
Collecting pip==19.3
  Using cached pip-19.3-py2.py3-none-any.whl (1.4 MB)
Installing collected packages: pip
  Attempting uninstall: pip
    Found existing installation: pip 20.3.1
    Uninstalling pip-20.3.1:
      Successfully uninstalled pip-20.3.1
Successfully installed pip-19.3

(env) $pip --version                                                                     trex@Tobiahs-MacBook-Pro
pip 19.3