Pip écrase-t-il les paquets installés par apt-get?

9

Que se passe-t-il si j'ai accidentellement pip installun package que j'ai déjà installé en utilisant apt-getau préalable? Dois-je simplement utiliser la dernière version (c'est-à-dire probablement celle que j'ai installée en utilisant pip)? Que se passe-t-il dans l'autre sens?

Remarque: Je n'utilise pas Python dans un environnement virtuel (simplement parce que je ne sais pas pourquoi je devrais - j'utilise Python comme outil d'analyse de données et j'essaie surtout d'utiliser la dernière version de tout).

Fred S
la source
Si je ne me trompe pas, vous n'installez pas les mêmes packages en utilisant apt-getetpip
Lucio
Corerct, les pipinstalle dans les /usr/localsous-répertoires par défaut ou dans tout autre répertoire si vous le souhaitez.
Timo
3
Mais que se passe-t-il, par exemple, si je fais d'abord apt-get install python-pandassuivi par pip install pandas, ou l'inverse? Comment mon installation globale de python sait-elle laquelle des deux versions utiliser?
Fred S
1
@FredS: Exécutez la commande suivante dans le terminal, Python recherchera dans cet ordre spécifique un module:python -c "import sys; print sys.path"
Timo

Réponses:

3

Comme @Timo l'a mentionné dans son commentaire, python -c "import sys; print sys.path"vous donnera le chemin de chargement du module Python pour votre installation de Python. Sur une installation relativement récente du 16.04, il y a trois répertoires à noter (parmi les 10 au total qui étaient dans le mien):

  • '' (répertoire de l'application)
  • '/usr/local/lib/python2.7/dist-packages' (où pip installe les modules)
  • '/usr/lib/python2.7/dist-packages' (où apt installe les modules)

Le plus important à noter, cependant, est que «/usr/local/lib/python2.7/dist-packages» est plus élevé en priorité que «/usr/lib/python2.7/dist-packages».

Si vous installez d'abord un paquet Python via apt (-get), il s'installera dans '/usr/lib/python2.7/dist-packages'. Si vous essayez plus tard d'utiliser pip pour installer le module, pip donnera initialement un avertissement que la dépendance est déjà satisfaite, puis quittera; l'ajout de l'option --upgrade forcera pip à installer, installant le module dans '/usr/local/lib/python2.7/dist-packages'. (Notez la sortie qui indique également que la version en « /usr/lib/python2.7/dist-packages » n'est pas désinstallée) Vous pouvez alors vérifier que la version pip installé est celui utilisé en utilisant ce qui suit: python -c "import MODULE; print MODULE.__file__".

En tant que tel, cela montre que les packages installés via pip auront priorité sur les packages installés par le système, mais n'écraseront rien installé depuis apt (-get).

Bryan Wyatt
la source
1

Pour ajouter à @Bryan Wyatt, il semble souhaitable (et prévu) que les éléments installés / mis à niveau PIP aient priorité sur les packages installés (probablement plus anciens) APT. Mon système avait les chemins apt et pip inversés. Cela devrait être (en ignorant les autres entrées):

  • '/usr/local/lib/python2.7/dist-packages' (où pip installe les modules)
  • '/usr/lib/python2.7/dist-packages' (où apt installe les modules)

Pourtant, en raison d'une action inconnue que j'ai dû prendre, ces chemins sont apparus dans l'ordre inverse pour moi (en ignorant les autres entrées):

  • '/usr/lib/python2.7/dist-packages' (où apt installe les modules)
  • '/usr/local/lib/python2.7/dist-packages' (où pip installe les modules)

Il se trouve quelque chose que je n'ajouté /usr/lib/python2.7/dist-packagesà /usr/local/lib/python2.7/dist-packages/easy-install.pth. Il suffit de supprimer la ligne de easy-install.pthcorriger le problème pour moi. /usr/lib/python2.7/dist-packagesest toujours sur mon chemin, car il est ajouté à un stade ultérieur ailleurs.

En guise de remarque, pprint affichera mieux votre chemin ... c'est-à-dire:

$ 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']
à proximité
la source