Встановлення декількох версій пакета з pip


85

У своєму додатку я хотів би використовувати:

  • packageA, що вимагає packageX==1.3
  • packageB, що вимагає packageX==1.4
  • packageX==1.5

Як я можу встановити кілька версій packageXз pip для вирішення цієї ситуації?


2
встановлюйте пакети в нестандартні місця, а потім використовуйте PYTHONPATH, щоб визначити, який саме імпортувати; див. цю відповідь
Yibo Yang

1
До речі, сценарій у цьому питанні та хакерське рішення у прийнятій на даний момент відповіді є хорошим прикладом того, чому власник пакету не повинен і не повинен бути вибагливим, щоб закріпити точну версію своєї залежності. Вони повинні були використовувати packageX>=1.3,<2і packageX>=1.4,<2(якщо припустимо, що пакет вищеX дотримується семантичної версії ), тоді у вас, як розробника додаткових програм, не буде проблем закріпити та використовувати, packageX==1.5і всі будуть задоволені. Детальніше тут
RayLuo

Відповіді:


65

pip не допоможе вам у цьому.

Ви можете сказати йому встановити певну версію, але вона замінить іншу. З іншого боку, використання двох віртуальних програм дозволить вам встановити обидві версії на одній машині, але не використовувати їх одночасно.

Найкраще встановити обидві версії вручну, розмістивши їх у своєму шляху Python з іншим ім’ям.

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

import dependencyname_version as dependencyname

Наразі немає чистого способу це зробити. Найкраще, на що ви можете сподіватися, це те, що цей хакер спрацював.

Я б віддав перевагу одній із двох бібліотек і замінив її еквівалентною, або виправив її, щоб прийняти нову версію залежності і повернути цю латку спільноті.


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
Avinash Raj
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.