apt-get install python-xxx vs pip install

8

Wciąż próbuję zrozumieć ten problem, który mam i przeczytałem mnóstwo postów dotyczących sudo apt-get install python-XXXvs pip install, i rozumiem jedną z nich (apt-get to repozytorium pakietów, zarządzane przez całkowicie inną grupę ludzi do pipowania, auto - aktualizuje wraz ze wszystkim innym, gdy dostępna jest aktualizacja, jest ona binarna itp.). Jest jednak kilka szczególnych rzeczy, których nie rozumiem i na które nie mogłem znaleźć odpowiedzi:

  1. Jeśli z jakiegoś powodu najpierw zainstaluję pakiet, np. Numpy, za pomocą sudo apt-get install numpy, a następnie zrobię to później pip install numpy. Co się dzieje? czy numpy jest ponownie instalowany w innym miejscu z inną wersją (np. w .local / lib), więc teraz mam dwie niezależne wersje? Który jest używany podczas importu? (jeśli dobrze zrozumiałem, to jest osobne, a apt-get obejmuje cały system, ale widziałem sprzeczne odpowiedzi na to pytanie, np. tutaj )

  2. Zauważyłem, że wiele pakietów na apt-get jest dość starych w porównaniu do pip. np. w momencie pisania ipython 2.3.0 vs 4.0.3, numpy 1.10.2 vs 1.10.4, spyder 2.3.5 vs 2.3.8. Czy jest jakaś zaleta, po której sudo apt-get installnastępuje najpierw pip install? czy to po prostu głupie?

  3. Zauważyłem, że mój pip miał 1.5.6 - jeśli to zrobisz, jest to najnowszy najnowszy sudo apt-get install python-pip. podczas gdy na pipie to 8.0.2! Myślę, że to sprawia mi problemy, ponieważ w tej starej wersji możesz ciągle instalować ten sam pakiet i to nie ostrzega. I jakoś nie zastępuje starego. Uświadomiłem sobie to, ponieważ mogę nadal odinstalowywać ten sam pakiet (np. Numpy) i zawsze tam jest, kiedy to robię pip show numpy. I dziwnie, zawsze pokazuje ten sam folder (.local /), ale z różnymi wersjami: S Mam więc dwa pytania z tym związane:

    za. jaki jest najlepszy sposób na zainstalowanie pipa? Obecnie jestem pochylony w kierunku sudo apt-get install python-pip, pip install pip, sudo apt-get purge python-pip. Czy to jest mądre? Wydaje mi się to trochę śmieszne.

    b. teraz, gdy wiem, że wiele moich pakietów jest pomieszanych ze zduplikowanymi instalacjami, prawdopodobnie dlatego, że niektóre zostały zainstalowane przy pomocy apt-get, a następnie wiele razy przy pomocy pip 1.5.6, jaki jest najlepszy sposób na sprawdzenie duplikatów i wyczyszczenie go? Zgaduję, że nie jest bezpiecznie używać skryptu do pipowania odinstaluj wszystko i zainstaluj ponownie?

PS Nie byłem pewien, czy powinienem opublikować to jako nowe pytanie, czy jako odpowiedź na mój pierwotny problem. Ponieważ to pytanie jest o wiele bardziej zwięzłe i ogólne, czułem, że byłoby lepiej osobno. Przepraszam, jeśli się pomyliłem.

notatka
źródło
Możliwy duplikat apt get install vs pip install
muru
Właściwie odnoszę się do tego postu w moim pytaniu, było to bardzo pomocne w wyjaśnieniu wielu moich nieporozumień, ale nie odpowiada na moje pytania powyżej (przynajmniej nie mogłem go zobaczyć)
nota
Och, w drugim pytaniu. Właśnie spojrzałem na listę powiązanych postów i tam jej nie widziałem.
muru

Odpowiedzi:

8

W przypadku archiwów po wielu próbach i błędach to właśnie znalazłem (z perspektywy czasu niektóre bity mają sens, inne są dość mylące).

  • Jeśli ty sudo apt-get install python-xyz, pakiet pojawi się w pip list. Oczywiście możesz zaimportować go do Pythona, ale nie pojawia się w pip.get_installed_distribution (). (Oczywiście odwrotność nie jest prawdą, tzn. Jeśli to zrobisz pip install xyz, nie pojawi się w twoim apt / synaptic)

  • Po sudo apt-get install python-xyzwykonaniu pip install xyztego, co się stanie, zależy od posiadanej wersji pipa.

OLD v1.5.6 (aktualna wersja dostarczana na Ubuntu PPA):

  • Ta wersja pipa (1.5.6) po prostu zainstaluje nową kopię xyz w innym miejscu. W efekcie powstaje wiele kopii, co powoduje ogromny bałagan. na przykład:

    • numpy z apt-get to 1.8.2 w /usr/local/lib/python2.7/dist-packages
    • numpy z pipa to 1.10.4 w ~ / .local / lib / python2.7 / site-packages
  • Jeśli zrobię to pip install numpyjeszcze raz, pobierze go i zainstaluje ponownie. Dzięki temu możesz uzyskać wiele różnych wersji, do których tak naprawdę nie masz dostępu. Mogę zrobić pip install numpy5 razy, a potem mogę zrobić pip uninstall numpy 5xczasy! Oczywiście możesz uważać, aby tego nie robić, ale czasami skrypty instalacyjne innego oprogramowania są nieco nieostrożne i mogą zepsuć. To niewiarygodne, że Ubuntu oficjalnie dostarcza tę wersję pipa.

NOWA wersja 8.0.2 (aktualna wersja na samym pipie):

  • nowsze wersje pipa (np. 8.0.2, który jest na pipie) odmówi zainstalowania tego samego pakietu, twierdząc, że wymaganie jest już spełnione. Nie możesz więc zainstalować nowej wersji. To jest dobre zachowanie (więcej na temat pobierania tej wersji pipa później).

  • W takim przypadku możesz tylko zaktualizować, tzn. Zainstalować z flagą -U.

  • Jednak podczas próby pip install -U xyzzainstalowania pakietu zainstalowanego za pomocą sudo apt-get, pojawi się błąd uprawnień, ponieważ apt-get został zainstalowany w / usr / i potrzebujesz do niego dostępu root.

  • Więc AFAIK, nie masz wyboru i musisz sudo pip install -U xyzgo zaktualizować. W takim przypadku pip instaluje najnowszy pakiet w tym samym miejscu, w którym napisał go sudo apt-get. np. w moim przypadku /usr/local/lib/python2.7/dist-packages. To jest dobre.

  • Warto również zauważyć, że pakiety na apt są często starsze niż te na pipie (np. Numpy v1.8.2 vs 1.10.4, scipy 0.14.1 vs 0.17.0, ipython 2.3 vs 4.0.3, spyder 2.3.5 vs 2.3.8)

Tak więc moim obecnym zamysłem jest zdobycie wielkich rzeczy sudo apt-get, np. sudo apt-get install python-numpy python-scipy python-matplotlib ipython ipython-notebook python-pandas python-sympy pythoSpyder z nosa

a następnie zaktualizuj je (lub przynajmniej niektóre z nich) za pomocą sudo pip install -U.

Uwaga: Wydaje się, że bardzo ważne jest zdobycie nowego pipa z pipa (bardzo meta)

sudo apt-get install python-pip
sudo pip install -U pip

PS Zdaję sobie sprawę z virtualenv, ale nie potrzebuję go teraz. Potrzebuję tylko jednego środowiska programistycznego.

A oto mały skrypt do zrzucenia listy pakietów, wersji i ścieżki (ale działa tylko na modułach zainstalowanych przez pip, a nie tych z apt-get)

import pip
pp = pip.get_installed_distributions()
for p in sorted([p.location+"\t"+p.project_name+" ("+p.version+")" for p in pp]):
    print p
notatka
źródło