Instalowanie wielu wersji pakietu za pomocą pip

85

W swojej aplikacji chciałbym użyć:

  • packageA, co wymaga packageX==1.3
  • packageB, co wymaga packageX==1.4
  • packageX==1.5

Jak mogę zainstalować wiele wersji programu packageXz pip, aby poradzić sobie w tej sytuacji?

limboy
źródło
2
zainstaluj pakiety w niestandardowych lokalizacjach, a następnie użyj PYTHONPATH, aby określić, który z nich zaimportować; zobacz tę odpowiedź
Yibo Yang,
1
Na marginesie, scenariusz w tym pytaniu i nietypowe rozwiązanie w obecnie przyjętej odpowiedzi są dobrym przykładem tego, dlaczego właściciel pakietu nie powinien i nie może być wybredny, aby przypiąć dokładną wersję swojej zależności. Powinni byli używać packageX>=1.3,<2i packageX>=1.4,<2(zakładając, że zewnętrzny pakiet X podąża za wersjonowaniem semantycznym ), wtedy ty jako deweloper aplikacji niższego szczebla nie miałbyś problemu z przypięciem i użyciem packageX==1.5i wszyscy byliby zadowoleni. Więcej szczegółów tutaj
RayLuo

Odpowiedzi:

65

pip nie pomoże ci w tym.

Możesz nakazać mu zainstalowanie określonej wersji, ale zastąpi ona inną. Z drugiej strony, użycie dwóch virtualenvów pozwoli ci zainstalować obie wersje na tym samym komputerze, ale nie będziesz ich używać w tym samym czasie.

Najlepiej jest zainstalować obie wersje ręcznie, umieszczając je w ścieżce Pythona pod inną nazwą.

Ale jeśli twoje dwie biblioteki oczekują, że będą miały tę samą nazwę (a powinny), będziesz musiał je zmodyfikować, aby wybierały wersję, której potrzebują, z pewnym aliasem importu, takim jak:

import dependencyname_version as dependencyname

Obecnie nie ma na to prostego sposobu. Możesz mieć nadzieję, że ten hack zadziała.

Wolałbym porzucić jedną z dwóch bibliotek i zastąpić ją odpowiednikiem lub załatać ją, aby zaakceptowała nową wersję zależności i zwróciła poprawkę społeczności.

e-satis
źródło
43
Czy nadal nie ma na to rozwiązania?
Håken Lid
2
Wciąż nie ma rozwiązania?
AjaxLeung,
1
Tak wiele języków ma ten problem ... Java, Go, Haxe ... mam nadzieję, że projektanci języków porzucą globalne przestrzenie nazw pakietów i zaadoptują system modułów podobny do Node.js w przyszłych językach, które tworzą, ponieważ Node.js obsługuje wiele wersji zależności.
Andy
15

Pobierz źródło dla ea. pakiet. Zainstaluj każdy w osobnym folderze. Na przykład. Miałem pakiet w wersji 1.10, ale chciałem przełączyć się na wersję deweloperską, aby trochę popracować. Pobrałem źródła dla modułu dev: git clone https://github.com/networkx/networkx.git cd netwokrx Stworzyłem folder dla tej wersji: mkdir /home/username/opt/python, a następnie ustawić PYTHONPATH env var do: export PYTHONPATH=/home/username/opt/python/lib/python2.7/site-packages/. Następnie zainstalowałem go za pomocą:python setup.py install --prefix=/home/username/opt/python

Teraz, ponieważ moja PYTHONPATH wskazuje teraz na ten inny folder pakietów witryn, kiedy uruchamiam Pythona w wierszu poleceń i importuję nowy moduł, działa. Aby przełączyć się z powrotem, usuń nowy folder z PYTHONPATH.

>>> import networkx as nx
>>> nx.__version__
'2.0.dev_20151209221101'
sAguinaga
źródło
2
Hah, przybyłem tutaj specjalnie, ponieważ walczę z networkxróżnicami wersji!
dwanderson
„Aby przełączyć się z powrotem, usuń nowy folder z PYTHONPATH.”, Ta część nie działa nawet po usunięciu nowej ścieżki folderu zsys.path
Avinash Raj,