Überschreibt pip von apt-get installierte Pakete?

9

Was passiert, wenn ich versehentlich pip installein Paket installiert habe, das ich bereits zuvor installiert habe apt-get? Kann ich einfach die neueste Version verwenden (dh wahrscheinlich die, mit der ich sie installiert habe pip)? Was passiert umgekehrt?

Hinweis: Ich verwende Python nicht in einer virtuellen Umgebung (einfach weil ich nicht weiß, warum ich es tun soll - ich verwende Python als Datenanalysetool und versuche meistens, die neueste Version von allem zu verwenden).

Fred S.
quelle
Wenn ich mich nicht irre, installieren Sie nicht die gleichen Pakete mit apt-getundpip
Lucio
Corerct, pipinstalliert sie /usr/localstandardmäßig in Unterverzeichnissen oder in einem anderen Verzeichnis, wenn Sie möchten.
Timo
3
Aber was passiert zum Beispiel, wenn ich zuerst apt-get install python-pandasgefolgt bin pip install pandasoder umgekehrt? Woher weiß meine globale Python-Installation, welche der beiden Versionen verwendet werden soll?
Fred S
1
@FredS: Führen Sie den folgenden Befehl im Terminal aus, Python sucht in dieser bestimmten Reihenfolge nach einem Modul:python -c "import sys; print sys.path"
Timo

Antworten:

3

Wie @Timo in seinem Kommentar erwähnt hat python -c "import sys; print sys.path", erhalten Sie den Ladepfad des Python-Moduls für Ihre Installation von Python. Bei einer relativ neuen Installation vom 16.04. Gibt es drei wichtige Verzeichnisse (unter den insgesamt 10, die sich in meinem befanden):

  • '' (Anwendungsverzeichnis)
  • '/usr/local/lib/python2.7/dist-packages' (wo pip Module installiert)
  • '/usr/lib/python2.7/dist-packages' (wo apt Module installiert)

Am wichtigsten ist jedoch, dass '/usr/local/lib/python2.7/dist-packages' Vorrang vor '/usr/lib/python2.7/dist-packages' hat.

Wenn Sie ein Python-Paket zuerst über apt (-get) installieren, wird es in '/usr/lib/python2.7/dist-packages' installiert. Wenn Sie später versuchen, das Modul mit pip zu installieren, gibt pip zunächst eine Warnung aus, dass die Abhängigkeit bereits erfüllt ist, und beendet das Programm. Durch Hinzufügen des Flags --upgrade wird pip zur Installation gezwungen, und das Modul wird in '/usr/local/lib/python2.7/dist-packages' installiert. (Beachten Sie die Ausgabe, die auch besagt, dass die Version in '/usr/lib/python2.7/dist-packages' nicht deinstalliert ist.) Sie können dann überprüfen, ob die von Pip installierte Version die folgende ist : python -c "import MODULE; print MODULE.__file__".

Als solches zeigt dies, dass über pip installierte Pakete Vorrang vor vom System installierten Paketen haben, aber nichts, was von apt (-get) installiert wurde, überschreiben.

Bryan Wyatt
quelle
1

Um @Bryan Wyatt hinzuzufügen, erscheint es wünschenswert (und beabsichtigt), dass installierte / aktualisierte PIP-Elemente Vorrang vor (wahrscheinlich älteren) installierten APT-Paketen haben. Bei meinem System waren die Apt- und Pip-Pfade umgekehrt. Es sollte sein (andere Einträge ignorieren):

  • '/usr/local/lib/python2.7/dist-packages' (wo pip Module installiert)
  • '/usr/lib/python2.7/dist-packages' (wo apt Module installiert)

Aufgrund einer unbekannten Maßnahme, die ich ergriffen haben muss, wurden diese Pfade für mich jedoch in umgekehrter Reihenfolge angezeigt (wobei andere Einträge ignoriert wurden):

  • '/usr/lib/python2.7/dist-packages' (wo apt Module installiert)
  • '/usr/local/lib/python2.7/dist-packages' (wo pip Module installiert)

Es stellt sich heraus, dass ich etwas hinzugefügt /usr/lib/python2.7/dist-packageshabe /usr/local/lib/python2.7/dist-packages/easy-install.pth. Durch einfaches Entfernen der Leitung wurde easy-install.pthdie Fehlordnung für mich behoben. /usr/lib/python2.7/dist-packagesist immer noch auf meinem Weg, da es zu einem späteren Zeitpunkt an anderer Stelle hinzugefügt wird.

Als Randnotiz zeigt pprint Ihren Pfad schöner an ... dh:

$ 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']
proximal
quelle