Контролировать версию pip в virtualenv

Как управлять версией pip, которая используется в только что созданной виртуальной среде? Я считаю, что я уничтожил все другие версии пипса из ОС, но все же mkvirtualenv получает пип-1.5 откуда-то! Я хочу, чтобы он использовал pip 1.4.1 в virtualenv.

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

Ответ 1

Достаточно легко заменить пип, который устанавливается в вашей виртуальной среде. В активной виртуальной среде просто выполните следующую команду:

pip install pip==1.4.1

Ответ 2

Из чтения источника virtualenv, похоже, что pip установлен из исходного tarfile, включенного в virtualenv. В virtualenv 1.10.1 это pip-1.4.1.tar.gz в каталоге site-packages/virtualenv_support (он получает setuptools с одного и того же места). Вы можете реально заменить этот архив для управления версией; virtualenv.py, по крайней мере, у меня есть версия, неважно, какая версия пипа есть:

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

Вы также можете передать параметр --no-pip, а затем установить версию из источника.

В virtualenv 1.11 он ищет файл колес (например, pip-*.whl) вместо tar.gz, но кроме этого он действует одинаково (спасибо @wim для обновления).

Ответ 3

Для меня я просто обновил pip/virtualenv/virtualenvwrapper на своей машине (не внутри virtualenv). Впоследствии созданные virtualenvs имели обновленную версию.

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