Czy pip zastępuje pakiety zainstalowane przez apt-get?

9

Co się stanie, jeśli przypadkowo skorzystam pip installz pakietu, który już zainstalowałem apt-get? Czy mogę po prostu użyć najnowszej wersji (tj. Prawdopodobnie tej, którą zainstalowałem pip)? Co dzieje się na odwrót?

Uwaga: Nie używam Pythona w środowisku wirtualnym (po prostu dlatego, że nie wiem, dlaczego powinienem - używam Pythona jako narzędzia do analizy danych i najczęściej próbuję używać najnowszej wersji wszystkiego).

Fred S.
źródło
Jeśli się nie mylę, nie instalujesz tych samych pakietów za pomocą apt-getipip
Lucio
Corerct pipinstaluje je /usr/localdomyślnie w podkatalogach lub w innym katalogu, jeśli chcesz.
Timo
3
Ale co się dzieje, na przykład, jeśli najpierw nie apt-get install python-pandasnastępuje pip install pandas, lub na odwrót? Skąd moja globalna instalacja Pythona wie, której z obu wersji użyć?
Fred S
1
@FredS: Uruchom następującą komendę w terminalu, Python przeszuka moduł w określonej kolejności:python -c "import sys; print sys.path"
Timo

Odpowiedzi:

3

Jak wspomniano w komentarzu @Timo, python -c "import sys; print sys.path"poda ścieżkę ładowania modułu Python do instalacji Pythona. Przy stosunkowo świeżej instalacji 16.04 istnieją trzy katalogi warte uwagi (spośród 10, które były w mojej kopalni):

  • '' (katalog aplikacji)
  • '/usr/local/lib/python2.7/dist-packages' (gdzie pip instaluje moduły)
  • '/usr/lib/python2.7/dist-packages' (gdzie moduły apt install)

Należy jednak zauważyć, że „/usr/local/lib/python2.7/dist-packages” ma wyższy priorytet niż „/usr/lib/python2.7/dist-packages”.

Jeśli najpierw zainstalujesz pakiet Python za pomocą apt (-get), zostanie on zainstalowany w '/usr/lib/python2.7/dist-packages'. Jeśli później spróbujesz użyć pip do zainstalowania modułu, pip początkowo ostrzeże, że zależność jest już spełniona, a następnie wyjdzie; dodanie flagi --upgrade zmusi pip do instalacji, instalując moduł w '/usr/local/lib/python2.7/dist-packages'. (Zawiadomienie wyjście, które mówi, że również w wersji „/usr/lib/python2.7/dist-packages” nie zostało odinstalowane) Można następnie sprawdź, czy wersja pip zainstalowany jest jeden wykorzystywane przy użyciu następujących: python -c "import MODULE; print MODULE.__file__".

Oznacza to, że pakiety zainstalowane przez pip będą miały pierwszeństwo przed pakietami zainstalowanymi przez system, ale nie zastąpią niczego zainstalowanego z apt (-get).

Bryan Wyatt
źródło
1

Aby dodać do @Bryan Wyatt, wydaje się pożądane (i zamierzone), aby zainstalowane / zaktualizowane elementy PIP miały pierwszeństwo przed (prawdopodobnie starszymi) zainstalowanymi pakietami APT. Mój system miał odwrócone ścieżki apt i pip. Powinno być (ignorując inne wpisy):

  • '/usr/local/lib/python2.7/dist-packages' (gdzie pip instaluje moduły)
  • '/usr/lib/python2.7/dist-packages' (gdzie moduły apt install)

Jednak z powodu jakichś nieznanych działań, które musiałem podjąć, ścieżki te pojawiły się dla mnie w odwrotnej kolejności (ignorując inne wpisy):

  • '/usr/lib/python2.7/dist-packages' (gdzie moduły apt install)
  • '/usr/local/lib/python2.7/dist-packages' (gdzie pip instaluje moduły)

Okazuje się coś, czego nie dodana /usr/lib/python2.7/dist-packagesdo /usr/local/lib/python2.7/dist-packages/easy-install.pth. Po prostu usunięcie linii ze easy-install.pthnaprawiło dla mnie nieporozumienia. /usr/lib/python2.7/dist-packageswciąż jest na mojej ścieżce, ponieważ dodaje się go później w innym miejscu.

Na marginesie, pprint sprawi, że Twoja ścieżka będzie ładniejsza ... tj .:

$ python -c "import sys; import pprint; pprint.pprint(sys.path)"
['',
 '/usr/lib/python2.7',
 '/usr/lib/python2.7/plat-x86_64-linux-gnu',
 '/usr/lib/python2.7/lib-tk',
 '/usr/lib/python2.7/lib-old',
 '/usr/lib/python2.7/lib-dynload',
 '/usr/local/lib/python2.7/dist-packages',
 '/usr/lib/python2.7/dist-packages',
 '/usr/lib/python2.7/dist-packages/PILcompat',
 '/usr/lib/python2.7/dist-packages/gtk-2.0',
 '/usr/lib/python2.7/dist-packages/ubuntu-sso-client']
proksymalny
źródło