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.
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.gitcd 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'
packageX>=1.3,<2
ipackageX>=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życiempackageX==1.5
i wszyscy byliby zadowoleni. Więcej szczegółów tutajOdpowiedzi:
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.
źródło
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'
źródło
networkx
różnicami wersji!sys.path