Tox устанавливает неверную версию pip для виртуального env

Я использую tox для управления некоторыми средами тестирования. У меня есть зависимость (backports.ssl-match-hostname), которую я не могу загрузить с использованием последней версии пипса, поэтому мне нужно вернуться к пункту 8.0.3, чтобы позволить установке работать.

Я включил версию кода версии 8.0.3 внутри моего файла tox.ini для зависимостей.

deps=
    pip==8.0.3

Однако, когда я бегу

source .tox/py27/bin/activate

и войдите в виртуальную среду тестирования, а затем запустите

pip --version

Я в итоге

8.1.2

Однако, вне моей токсической среды, когда я запускаю ту же команду, я получаю

8.0.3

Есть ли что-то особенное, что ток делает при захвате пипса? Почему я не могу указать версию пипса, которую я хочу использовать в качестве зависимости?

EDIT: чтобы добавить к этому, кажется, что я могу захватить зависимость pip == 8.0.3, но для других зависимостей они все еще работают из команды, запущенной с помощью pip == 8.1.2

Итак, мне нужно сначала захватить pip == 8.0.3, а затем установить его, захватить все остальное. Все еще не уверены, почему ток начинается с pip == 8.1.2

Ответ 1

Это, по-видимому, было результатом пакета "virtualenvs" python, содержащего предварительно выбранную группу пакетов python, на которую он ссылается, один из которых был последним и самым лучшим пипсом.

Я не знаю, является ли это предпочтительным способом сделать это, но я нашел успех, запустив

pip uninstall virtualenv

А затем переустановить с версией, которая работала

pip install virtualenv==15.0.1

С "правильной" версией virtualenv на месте я смог запустить свою команду tox

source .tox/py27/bin/activate

и посмотреть желаемую версию пипса

pip --version
pip 8.0.3

Ответ 2

Обходной путь для этого можно найти здесь: https://github.com/pypa/pip/issues/3666

Хотя для его работы мне пришлось написать "pip install pip == 8.1.1" в моем скрипте. Так что напомню:

Добавьте в проект сценарий pip.sh:

#!/bin/bash
pip install pip==8.1.1
pip install "[email protected]"

Добавьте к вашему tox.ini:

install_command = {toxinidir}/pip.sh {opts} {packages}

Ответ 3

Я недавно столкнулся с этой проблемой. У меня это было какое-то время, но он просто не регистрировался, потому что у меня были такие случайные сбои с кодом Python 2/3. Другой способ, которым это может случиться, - это, как и я, изменить виртуальный интерфейс между различными версиями Python и не очищать.

Проверьте /bin или /Scripts чтобы узнать, указывает ли python2 на python. Если virtualenv - это Python 3, то это будет означать, что python2 самом деле вызывает Python 3. И наоборот, если вы virtualenv - это Python 2, и вы хотите протестировать код Python 3.