Tox использует неправильную версию pip при установке нескольких версий python

У меня есть сборка, которая поддерживает python 2.4, 2.6 и 2.7. Это приводит к установке различных версий пипсов по мере необходимости в их собственных установках python. Я использую tox для запуска тестов через setup.py.

Всякий раз, когда я запускаю {python2.7_installation_dir}/bin/python setup.py test, это приводит к каталогу .tox. Внутри каталога .tox я запускаю

py27/bin/pip --version 
pip 1.4.1 from {my_package}/.tox/py27/lib/python2.7/site-packages (python 2.7)


[[email protected] .tox]# python2.7 
Python 2.7.6 (default, Nov 20 2013, 15:33:09) 
[GCC 4.1.2 20080704 (Red Hat 4.1.2-54)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import pip
>>> pip.__version__
'1.5.2'

Таким образом, версия pip внутри каталога .tox - это 1.4.1, где в качестве пипа, установленного для интерпретатора python, который я использую для выполнения setup.py test, является 1.5.2. Это приводит к ошибкам при запуске тестов, поскольку он использует pip для установки каталогов, а некоторые из них поступают из внешних источников, а в 1.5.2 нам нужно явно указать --allow-external --allow-notverified flag для одного из модулей, который не существует в 1.4.1, что приводит к ошибке при каждом вызове тестов через ток.

Существует только одна установка python2.7, и она устанавливается из источника. Но я думаю, что он выполнял команду 1.4.1, но теперь был обновлен, чтобы использовать 1.5.2. Как ток может использовать старую версию? Есть ли какой-либо файл .pth или что-то, что могло быть оставлено позади, для чего требуется очистка?

Я мог бы сбросить tox и запустить pytests напрямую, но я бы предпочел запустить их через tox.
Пожалуйста, дайте мне знать, хотите ли вы видеть журналы, я могу обновить вопрос журналом.

Ответ 1

tox создает virtualenv в .tox/py27, .tox/py35 и т.д. в зависимости от версий python, с которыми вы тестируете (т.е. на основе envlist в tox.ini или аргумента опции -e). tox затем устанавливает pip в этот virtualenv, и ваши пакеты, и все пакеты, на которые зависит ваш пакет.

В дальнейших запусках, чтобы сэкономить время, virtualenv повторно используется, и только ваш пакет переустановлен (и обновлены возможные зависимости). Ваш pip останется в исходной версии, если вы не выполните:

./tox/py27/bin/pip install -U pip

или повторно инициализировать полный virtualenv с помощью

tox -r -e py27

(или tox -r для всех .tox virtualenvs для всех версий python в вашем envlist).

Если вы хотите проанализировать, как tox выполняет настройку, сначала вызовите:

tox -r -e py27 -vv

на выходе вы можете увидеть шаг recreate:

py27 recreate: /src/site-packages/your/package/.tox/py27
  removing /src/site-packages/your/package/.tox/py27
setting PATH=/src/site-packages/your/package/.tox/py27/bin:/opt/python/2.7/bin:........
  /src/site-packages/your/package/.tox$ python -m virtualenv --python /opt/python/2.7.13rc1/bin/python py27 >/src/site-packages/your/package/.tox/py27/log/py27-0.log

Теперь вы переходите к директории .tox и добавляете подробное создание виртуального файла:

cd .tox; rm -rf py27
python -m virtualenv --python /opt/python/2.7/13rc1/bin/python py27

Из этого журнала вы увидите, что он использует последнюю (кэшированную) версию pip. Поскольку ваша нормальная установка получает вам последнюю версию pip, не нужно чистить/обновлять кеш pip.

Ответ 2

Используйте этот подход: создайте файл tox.ini на том же уровне, что и ваш setup.py, и используйте его, чтобы указать, какие версии будут запущены, например здесь