Установка нескольких версий пакета с помощью pip

85

В своем приложении я хотел бы использовать:

  • packageA, что требует packageX==1.3
  • packageB, что требует packageX==1.4
  • packageX==1.5

Как я могу установить несколько версий packageXс помощью pip, чтобы справиться с этой ситуацией?

Limboy
источник
2
установите пакеты в нестандартные местоположения, затем используйте PYTHONPATH, чтобы определить, какой из них импортировать; см. этот ответ
Ибо Ян
1
С другой стороны, сценарий в этом вопросе и хакерское решение в принятом в настоящее время ответе являются хорошим примером того, почему владелец пакета не должен и не должен быть разборчивым, чтобы закрепить точную версию своей зависимости. Они должны были использовать packageX>=1.3,<2и packageX>=1.4,<2(при условии, что восходящий пакет X следует семантическому управлению версиями ), тогда у вас, как у разработчика приложений нижнего уровня, не будет проблем с закреплением и использованием, packageX==1.5и все будут счастливы. Подробнее здесь
RayLuo

Ответы:

65

pip вам в этом не поможет.

Вы можете указать ему установить определенную версию, но она заменит другую. С другой стороны, использование двух виртуальных машин позволит вам установить обе версии на одном компьютере, но не использовать их одновременно.

Лучше всего установить обе версии вручную, поместив их в свой путь Python с другим именем.

Но если две ваши библиотеки ожидают, что у них будет одно и то же имя (а они должны), вам придется изменить их, чтобы они выбирали нужную им версию с некоторым псевдонимом импорта, например:

import dependencyname_version as dependencyname

В настоящее время нет чистого способа сделать это. Лучшее, на что вы можете надеяться, - это то, что этот взлом сработает.

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

e-satis
источник
43
По-прежнему нет решения этого?
Håken Lid
2
Все еще нет решения?
AjaxLeung
1
У многих языков есть эта проблема ... Java, Go, Haxe ... надеюсь, разработчики языков откажутся от глобальных пространств имен пакетов и примут модульную систему, больше похожую на Node.js, в создаваемые ими языки в будущем, поскольку Node.js поддерживает несколько версий зависимости.
Энди
15

Загрузите исходный код для ea. пакет. Устанавливайте каждый в свою отдельную папку. Например. У меня был пакет версии 1.10, но я хотел переключиться на версию для разработчиков для некоторой работы. Я скачал исходники модуля Dev: git clone https://github.com/networkx/networkx.git cd netwokrx Я создал папку для этой версии: mkdir /home/username/opt/python, то я поставил PYTHONPATH ENV вар в: export PYTHONPATH=/home/username/opt/python/lib/python2.7/site-packages/. Затем я установил его, используя:python setup.py install --prefix=/home/username/opt/python

Теперь, поскольку мой PYTHONPATH теперь указывает на эту другую папку пакетов сайтов, когда я запускаю python в командной строке и импортирую новый модуль, он работает. Чтобы переключиться обратно, удалите новую папку из PYTHONPATH.

>>> import networkx as nx
>>> nx.__version__
'2.0.dev_20151209221101'
Сагинага
источник
2
Ха, я пришел сюда специально, потому что я борюсь с networkxразличиями версий!
dwanderson
«Чтобы переключить переключатель обратно, удалите новую папку из PYTHONPATH.», Эта часть не работает для меня даже после удаления пути к новой папке изsys.path
Авинаш Радж