apt-get install vs pip install

103

Jestem trochę zdezorientowany przypadkami, w których powyższe polecenia muszą być użyte podczas pobierania pakietów pytona. Próbowałem pobrać pakiet o nazwie pyudev zgodnie z odpowiedzią na to pytanie . Wykonałem to polecenie:

sudo pip install python-pyudev

ale otrzymał następujący komunikat:

Downloading/unpacking python-pyudev

  Could not find any downloads that satisfy the requirement python-pyudev
Cleaning up...
No distributions at all found for python-pyudev
Storing complete log in /home/vineet/.pip/pip.log

Jednak następujące działały dobrze:

sudo apt-get install python-pyudev

Kiedy apt-getnależy instalować pakiety, a kiedy python-pipużywać?

Vineet Kaushik
źródło
2
pipsłuży do instalowania tylko pakietów Pythona, ale apt-getsłuży do instalowania wszystkich pakietów.
Avinash Raj
3
ok .. więc dlaczego pip nie mógł zainstalować Pythona-Pyudev?
Vineet Kaushik,

Odpowiedzi:

100

PyPI to indeks pakietu Python - repozytorium modułów python.

pipsłuży do pobierania i instalowania pakietów bezpośrednio z PyPI. PyPI jest hostowany przez Python Software Foundation . Jest to specjalistyczny menedżer pakietów, który zajmuje się tylko pakietami python.

apt-get służy do pobierania i instalowania pakietów z repozytoriów Ubuntu obsługiwanych przez Canonical.

Niektóre różnice między instalowaniem pakietów Pythona apt-geti pipsą następujące:

  • Canonical zapewnia tylko pakiety dla wybranych modułów Pythona. Natomiast PyPI obsługuje znacznie szerszą gamę modułów python. Istnieje więc wiele modułów Pythona, których nie będziesz mógł zainstalować apt-get.

  • Canonical obsługuje tylko jedną wersję dowolnego pakietu (zazwyczaj najnowszą lub najnowszą wydaną w przeszłości). Tak więc, apt-getnie możemy zdecydować, którą wersję pakietu python chcemy. pippomaga nam w tej sytuacji. Możemy zainstalować dowolną wersję pakietu, która została wcześniej przesłana do PyPI. Jest to niezwykle pomocne w przypadku konfliktu zależności.

  • apt-getinstaluje moduły python w lokalizacji ogólnosystemowej. Nie możemy po prostu instalować modułów w naszym projekcie virtualenv . piprozwiązuje ten problem dla nas. Jeśli używamy pippo aktywacji virtualenv, jest wystarczająco inteligentny, aby zainstalować moduły tylko w naszym projekcie virtualenv. Jak wspomniano w poprzednim punkcie, jeśli istnieje wersja konkretnego pakietu python już zainstalowana w lokalizacji ogólnosystemowej, a jeden z naszych projektów wymaga starszej wersji tego samego pakietu python, w takich sytuacjach możemy użyć virtualenv i pip do instalacji ta starsza wersja pakietu python bez żadnych konfliktów.

  • Jak @Radu Rădeanu wskazał w tej odpowiedzi , nie byłoby generalnie różnica w nazwach pakietów, jak również. Canonical zwykle nazywa pakiety Python 2 jako, python-<package_name>a pakiety Python 3 jako python3-<package_name>. Podczas gdy na pipogół musimy po prostu używać <package_name>zarówno dla pakietów Python 2, jak i Python3.

Którego powinieneś użyć:

Zarówno apt-geti pipsą dojrzałe menedżery pakietów, który automatycznie zainstalować dowolną inną zależność pakietów podczas instalacji. Możesz użyć dowolnej osoby. Jeśli jednak musisz zainstalować określoną wersję pakietu python lub zainstalować pakiet w virtualenv lub zainstalować pakiet, który jest hostowany tylko w PyPI; tylko pippomoże ci rozwiązać ten problem. W przeciwnym razie, jeśli nie masz nic przeciwko instalowaniu pakietów w lokalizacji ogólnosystemowej, tak naprawdę nie ma znaczenia, czy używasz apt-getczy pip.

Aditya
źródło
5
Ponadto, należy próbować użyć jednego lub drugiego , a nie obie pipi apt-getsimutaneously.
earthmeLon
3
Wcześniej czy później może być potrzebny pakiet lub jego wersja, której nie zapewnia apt-get. Ponieważ używanie obu tych elementów apt-geti pipmoże powodować konflikty, czy powinno się zawsze używać pippakietów obsługiwanych przez pip?
Abhishek Anand,
2
@Abhishek, moją preferowaną metodą jest zawsze używanie Pythona przez virtualenv .. Tak, wolę używać pipa zamiast apt ..
Aditya
To otwiera własną puszkę robaków w niektórych scenariuszach. Załóżmy, że zainstalowałeś większość swoich pakietów sudo pipbez, virtualenvponieważ większość twoich projektów potrzebowała tego samego środowiska (ale bardziej rozbudowanego niż to, co zapewnia czysta instalacja Ubuntu). Wtedy, kiedy zrobić upgrade systemu i Ubuntu postanawia Python uaktualnić do nowej wersji (jak z zestydo artful- Python 3.5 do 3.6), wszystkich pakietów zainstalowanych w PIP- /usrpozostają w tyle i pip.get_installed_distributions()tworzy pustą listę.
z33k
Używanie pipa w kontekście globalnym jest po prostu błędne i nie wolno go używać, ponieważ spowoduje to bałagan w instalacji systemu w języku Python. pip i apt-get mają zupełnie inne rzeczy, a porównywanie ich jest błędne. Spróbuj zainstalować moduł Pythona, który zależy od innych bibliotek innych niż Python, a szybko zrozumiesz, dlaczego możesz potrzebować apt-get.
mestia
21

Jak powiedział @AvinashRaj w swoim komentarzu , pipsłuży jedynie do instalowania pakietów Pythona, ale apt-getsłuży do instalowania pakietów utworzonych w dowolnym języku programowania.

Twoim głównym problemem jest znalezienie odpowiedniej nazwy pakietu w obu przypadkach:

pip search pyudev

poda właściwą nazwę pakietu, którego chcesz zainstalować pip install, as

apt-cache search pyudev

poda prawidłową nazwę pakietu, który chcesz zainstalować, używając apt-get install:

radu@Radu: ~ $ pip search pyudev
pyudev                    - A libudev binding
radu@Radu: ~ $ apt-cache search pyudev
python-pyudev - Python bindings for libudev
python3-pyudev - Python3 bindings for libudev

Tak więc, w conlusion, korespondent sudo apt-get install python-pyudevjest sudo pip install pyudev, nie sudo pip install python-pyudev.

Teraz zależy od Ciebie, co chcesz wybrać, kiedy chcesz zainstalować pakiet python: piplub apt-get. Zobacz na przykład niniejsze pytania i odpowiedzi dotyczące różnicy w instalowaniu pakietu przy użyciu pipi apt-get.

Radu Rădeanu
źródło
2

Moim preferowanym sposobem jest zawsze używać apti tylko w przypadku, gdy moduł nie jest jeszcze dostępny w repozytorium Debian / Ubuntu do użycia pip, ale tylko w kontekście użytkownika - --userflaga. Korzystając z pipjednego z nich, musisz zainstalować wszystkie zależności kompilacji z, powiedzmy, repozytorium Ubuntu lub zapewnić je same, co może być żmudnym zadaniem. apt-getinstaluj pakiety binarne podczas pipkompilacji po pobraniu. Nie należy używać pip do instalowania modułów w lokalizacjach systemu. To jest po prostu źle. Zawsze używaj --userflagi, aby zainstalować moduł w lokalizacji domowej. Prawidłowo skonfigurowana PYTHONPATH pozwala pythonowi najpierw pobrać moduły z HOME, a następnie zainstalować moduły systemowe apt-get.

mestia
źródło