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, и используйте его, чтобы указать, какие версии будут запущены, например здесь