J'essaie toujours de comprendre ce problème que j'ai et j'ai lu une tonne d'articles sur Sudo apt-get install python-XXX
vs pip install
, et j'en comprends le sens (apt- get est un repo de paquet, géré par un groupe de personnes complètement différent à pépiner, des mises à jour automatiques ainsi que tout le reste quand une mise à jour est disponible, c'est binaire, etc. Cependant, il y a quelques points particuliers que je ne comprends pas et pour lesquels je n'ai pas trouvé de réponses:
Si, pour une raison quelconque, j'installe d'abord un package, par exemple numpy, avec Sudo apt-get install numpy
, puis j'ai plus tard pip install numpy
. Ce qui se produit? est numpy installé à nouveau ailleurs avec une version différente (par exemple, en .local/lib), alors maintenant avoir deux versions indépendantes? Lequel est utilisé lors de l'importation? (Si j'ai bien compris, il est distinct et apt-get concerne tout le système, mais j'ai déjà vu des réponses contradictoires à cette question, par exemple ici )
J'ai remarqué que beaucoup de paquets sur apt-get sont assez vieux comparés à pip. par exemple. au moment de la rédaction de cet article, ipython 2.3.0 vs 4.0.3, numpy 1.10.2 vs 1.10.4, spyder 2.3.5 vs 2.3.8. Y a-t-il un avantage à commencer par Sudo apt-get install
suivi d'un pip install
? ou est-ce juste stupide?
J'ai remarqué que mon pip était de 1.5.6 - c'est le dernier en date si vous faites Sudo apt-get install python-pip
. alors que sur pip c'est 8.0.2! Je crois que cela me cause des problèmes, car avec cette ancienne version, vous pouvez installer le même paquet encore et encore et cela ne vous avertit pas. Et de toute façon, il n’écrit pas l’ancien. Je m'en suis rendu compte car je peux continuer à désinstaller le même package (par exemple, numpy) et il est toujours présent lorsque je fais pip show numpy
. Et curieusement, toujours en montrant le même dossier (.local /), mais avec des versions différentes: S Donc, j'ai deux questions liées à cela:
une. Quel est le meilleur moyen d'installer pip? Je suis actuellement penché vers Sudo apt-get install python-pip
, pip install pip
, Sudo apt-get purge python-pip
. Est-ce sage? Cela me semble un peu ridicule.
b. Maintenant que je sais que beaucoup de mes paquets sont gâchés par des installations en double, probablement parce que certains ont été installés avec apt-get puis plusieurs fois plus tard avec le pip 1.5.6, quel est le meilleur moyen de vérifier les doublons et de les nettoyer? Je suppose que ce n’est pas sûr d’utiliser un script pour pipper tout désinstaller et réinstaller?
P.S. Je ne savais pas trop si je devais publier cette question sous forme de nouvelle question ou de réponse à mon problème initial. Comme cette question est beaucoup plus concise et générale, j’ai pensé qu’il serait préférable de la séparer. Excuses si je me suis trompé.
Pour les archives, après de nombreux essais et erreurs, c’est ce que j’ai trouvé (rétrospectivement, certains éléments ont un sens, d’autres assez déroutants).
Si vous Sudo apt-get install python-xyz
, le paquet sera apparaîtra dans pip list
. Bien sûr, vous pouvez l'importer en python, mais ne le fait pas apparaît dans pip.get_installed_distributions (). (Évidemment, le contraire est pas vrai. C’est-à-dire que si vous faites pip install xyz
il n’apparaîtra pas dans votre apt/synaptic)
Après Sudo apt-get install python-xyz
si vous faites pip install xyz
, ce qui se produit dépend de la version de pip que vous avez.
OLD v1.5.6 (la version actuelle est fournie avec Ubuntu PPA):
Cette version de pip (1.5.6) installera simplement une nouvelle copie de xyz dans un emplacement différent. Vous vous retrouvez avec plusieurs copies et cela provoque un désordre énorme. par exemple:
Si je fais encore pip install numpy
, il le télécharge et l'installe à nouveau. Vous pouvez donc vous retrouver avec de nombreuses versions différentes auxquelles vous ne pouvez pas vraiment accéder. Je peux faire pip install numpy
5 fois, puis pip uninstall numpy 5x
fois! Évidemment, vous pouvez faire attention à ne pas faire cela, mais parfois, les scripts d'installation d'autres logiciels sont un peu négligents et peuvent gâcher les choses. Incroyable qu'Ubuntu envoie officiellement cette version de pip.
NEW v8.0.2 (la version actuelle sur pip lui-même):
les versions les plus récentes de pip (par exemple 8.0.2 qui est sur pip) refuseront d’installer le même paquet en disant que les exigences sont déjà remplies. Donc, vous ne pouvez pas installer une nouvelle version. C'est un bon comportement (plus d'informations sur l'obtention de cette version de pip ultérieurement).
Dans ce cas, vous ne pouvez effectuer une mise à niveau, c’est-à-dire installer avec le drapeau -U.
Cependant, lorsque vous essayez de pip install -U xyz
sur un paquet installé avec Sudo apt-get, vous obtiendrez une erreur d'autorisations, car apt-get a été installé dans/usr/et vous avez besoin d'un accès root pour y écrire.
Donc, autant que je sache, vous n'avez pas d'autre choix que de Sudo pip install -U xyz
pour pouvoir le mettre à jour. Dans ce cas, pip installe le dernier paquet au même endroit que celui écrit par Sudo. par exemple. dans mon cas, /usr/local/lib/python2.7/dist-packages. C'est bon.
Il est également intéressant de noter que les paquets sur apt sont souvent plus vieux que ceux sur pip (par exemple, 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)
Donc, ma pensée actuelle est d’obtenir les grandes choses avec Sudo apt-get
, par exemple. Sudo apt-get install python-numpy python-scipy python-matplotlib ipython ipython-notebook python-pandas python-sympy pytho
spyder au nez
puis mettez-les à jour (ou au moins certains d'entre eux) avec Sudo pip install -U
.
NB Il semble assez important d'obtenir le nouveau pip de pip (très méta)
Sudo apt-get install python-pip
Sudo pip install -U pip
P.S. Je suis conscient de virtualenv mais je n’en ai pas besoin pour le moment. J'ai besoin d'un seul environnement de développement.
Et voici un petit script pour dump une liste de paquetages, version et chemin (mais ne fonctionne que sur les modules installés par pip, pas ceux d'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