apt-get install vs pip install

103

Je suis un peu confus quant aux cas dans lesquels les commandes ci-dessus doivent être utilisées lors du téléchargement de packages python. J'essayais de télécharger un paquet nommé Pyudev conformément à une réponse à cette question . J'ai exécuté cette commande:

sudo pip install python-pyudev

mais a reçu le message suivant:

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

Cependant, les éléments suivants ont bien fonctionné:

sudo apt-get install python-pyudev

Quand est-il apt-getcensé être utilisé pour installer des packages et quand est-il python-piputilisé?

Vineet Kaushik
la source
2
pipest utilisé pour installer uniquement les packages python, mais apt-getpour installer tous les packages.
Avinash Raj
3
ok..so pourquoi pip n'a-t-il pas pu installer python-pyudev?
Vineet Kaushik

Réponses:

100

PyPI est l'index du package Python - le référentiel des modules Python.

pipest utilisé pour télécharger et installer des packages directement à partir de PyPI. PyPI est hébergé par Python Software Foundation . C'est un gestionnaire de paquets spécialisé qui ne traite que les paquets python.

apt-get est utilisé pour télécharger et installer des packages à partir de référentiels Ubuntu hébergés par Canonical.

Certaines des différences entre l’installation de packages python à partir de apt-getet pipsont les suivantes:

  • Canonical fournit uniquement des packages pour certains modules python. PyPI héberge une gamme beaucoup plus étendue de modules python. Donc, il y a beaucoup de modules python que vous ne pourrez pas installer avec apt-get.

  • Canonical n’héberge qu’une version unique de chaque package (généralement la dernière ou celle publiée récemment). Donc, avec apt-getnous ne pouvons pas décider de la version de python-package que nous voulons. pipnous aide dans cette situation. Nous pouvons installer n’importe quelle version du paquet qui a été précédemment téléchargée sur PyPI. Ceci est extrêmement utile en cas de conflit dans les dépendances.

  • apt-getinstalle les modules python à l’emplacement du système. Nous ne pouvons pas simplement installer des modules dans notre projet virtualenv . piprésout ce problème pour nous. Si nous utilisons pipaprès l'activation de virtualenv, il est suffisamment intelligent pour installer uniquement les modules dans notre projet virtualenv. Comme mentionné dans le point précédent, si une version d'un package python particulier est déjà installée dans un emplacement système, et qu'un de nos projets nécessite une version plus ancienne du même package python, vous pouvez dans ce cas utiliser virtualenv et pip pour installer cette ancienne version du paquet python sans aucun conflit.

  • Comme @Radu Rădeanu l'a souligné dans cette réponse , il y aurait généralement une différence dans les noms des paquets. Canonical nomme généralement les packages Python 2 python-<package_name>et Python 3 python3-<package_name>. Alors que pour pipnous, nous n’avons généralement besoin que d’utiliser <package_name>à la fois les paquets Python 2 et Python3.

Lequel devriez-vous utiliser:

Les deux apt-getet pipsont des gestionnaires de paquets matures qui installent automatiquement toute autre dépendance de paquet lors de l’installation. Vous pouvez utiliser n'importe qui comme bon vous semble. Toutefois, si vous devez installer une version particulière de python-package, ou installer le package dans un virtualenv, ou installer un package uniquement hébergé sur PyPI. seulement pipvous aider à résoudre ce problème. Sinon, si cela ne vous dérange pas d'installer les paquets dans un emplacement système, peu importe que vous utilisiez apt-getou non pip.

Aditya
la source
5
En outre, vous devriez essayer d'utiliser l' un ou l'autre , et non les deux pipet apt-getsimultanément.
earthmeLon
3
Tôt ou tard, il se peut que vous ayez besoin d’un paquet ou d’une version de celui-ci qui n’est pas fourni par apt-get. Parce que l'utilisation des deux apt-getet pippeut causer des conflits, le conseil devrait-il être de toujours utiliser pippour les paquets supportés par pip?
Abhishek Anand
2
@Abhishek, ma méthode préférée est de toujours utiliser Python via un virtualenv .. Donc, oui, je préfère utiliser pip sur apt ..
Aditya
Cela ouvre sa propre boîte de Pandore dans certains scénarios. Supposons que vous avez installé la plupart de vos paquets avec sudo pipsans virtualenvparce que la plupart de vos projets avaient besoin du même environnement (mais plus étendu que celui fourni avec une installation propre d'Ubuntu). Ensuite, lorsque vous effectuez une mise à niveau du système et que Ubuntu décide de mettre à niveau Python vers une nouvelle version (comme avec zestyto artful- Python 3.5 à 3.6), tous vos paquets installés par pip /usrsont laissés et pip.get_installed_distributions()produisent une liste vide.
Z33K
L'utilisation de pip dans un contexte global est tout à fait erronée et ne doit pas être utilisée, car cela gâcherait l'installation de Python. pip et apt-obtiennent des choses complètement différentes, et il est faux de les comparer. Essayez d'installer un module python qui dépend d'autres bibliothèques non-python et vous comprendrez rapidement pourquoi vous pourriez avoir besoin d'apt-get.
Mestia le
21

Comme @AvinashRaj l'a dit dans son commentaire , il pipest utilisé uniquement pour installer des packages python, mais apt-getpour installer des packages créés dans n'importe quel langage de programmation.

Votre problème principal est de trouver le bon nom de paquet dans les deux cas:

pip search pyudev

vous donnera le bon nom pour le paquet que vous voulez installer en utilisant pip install, comme

apt-cache search pyudev

vous donnera le bon nom pour le paquet que vous voulez installer en utilisant 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

Donc, en conclusion, le correspondant de sudo apt-get install python-pyudevn'est sudo pip install pyudevpas sudo pip install python-pyudev.

Maintenant, cela dépend de ce que vous voulez choisir pour installer un paquet Python: pipou apt-get. Voir, par exemple, ce Q & A sur la différence d’installation d’un paquet avec pipet apt-get.

Radu Rădeanu
la source
2

Ma méthode préférée est de toujours utiliser aptet seulement si le module n’est pas encore disponible dans le référentiel Debian / Ubuntu pip, mais seulement dans le contexte utilisateur - --userindicateur. En utilisant l’ pipun d’eux, il faut obtenir toutes les dépendances de construction installées à partir du référentiel Ubuntu ou les fournir elles-mêmes, ce qui peut être une tâche fastidieuse. apt-getInstallez les paquets binaires pendant que vous les pipconstruisez après le téléchargement. Il ne faut pas utiliser pip pour installer des modules dans des emplacements système. C'est tout simplement faux. Utilisez toujours --userflag pour installer un module chez vous. Correctement configuré, PYTHONPATH permet à python de récupérer d’abord les modules à partir de HOME, puis les modules système installés avec apt-get.

Mestia
la source