Installieren mehrerer Versionen eines Pakets mit pip

84

In meiner Bewerbung möchte ich verwenden:

  • packageA, welches benötigt packageX==1.3
  • packageB, welches benötigt packageX==1.4
  • packageX==1.5

Wie kann ich mehrere Versionen von packageXmit pip installieren , um diese Situation zu bewältigen?

Limboy
quelle
2
Installieren Sie Pakete an nicht standardmäßigen Speicherorten und bestimmen Sie dann mit PYTHONPATH, welche Pakete importiert werden sollen. siehe diese Antwort
Yibo Yang
1
Nebenbei bemerkt, das Szenario in dieser Frage und die Hacky-Lösung in der derzeit akzeptierten Antwort sind ein gutes Beispiel dafür, warum ein Paketbesitzer nicht wählerisch sein sollte und darf, um eine genaue Version seiner Abhängigkeit zu bestimmen. Sie hätten verwenden sollen packageX>=1.3,<2und packageX>=1.4,<2(vorausgesetzt, das Upstream-Paket X folgt der semantischen Versionierung ), dann hätten Sie als Entwickler der Downstream-App kein Problem damit, sie zu pinnen und zu verwenden, packageX==1.5und alle wären glücklich. Weitere Details hier
RayLuo

Antworten:

63

pip wird dir dabei nicht helfen.

Sie können festlegen, dass eine bestimmte Version installiert werden soll, die andere Version wird jedoch überschrieben. Wenn Sie jedoch zwei virtuelle Envs verwenden, können Sie beide Versionen auf demselben Computer installieren, aber nicht gleichzeitig verwenden.

Am besten installieren Sie beide Versionen manuell, indem Sie sie mit einem anderen Namen in Ihren Python-Pfad einfügen.

Wenn Ihre beiden Bibliotheken jedoch erwarten, dass sie denselben Namen haben (und sollten), müssen Sie sie ändern, damit sie die benötigte Version mit einem Importalias wie dem folgenden abrufen:

import dependencyname_version as dependencyname

Derzeit gibt es keine saubere Möglichkeit, dies zu tun. Das Beste, was Sie hoffen können, ist, dass dieser Hack funktioniert.

Ich würde lieber eine der beiden Bibliotheken fallen lassen und durch eine entsprechende ersetzen oder sie patchen, um die neue Version der Abhängigkeit zu akzeptieren und den Patch der Community zurückzugeben.

e-satis
quelle
42
Gibt es dafür noch keine Lösung?
Håken Deckel
2
Immer noch keine Lösung?
AjaxLeung
1
So viele Sprachen haben dieses Problem ... Java, Go, Haxe ... hoffentlich werden Sprachdesigner globale Paket-Namespaces aufgeben und in zukünftigen Sprachen, die sie erstellen, ein Node.js-ähnliches Modulsystem verwenden, da Node.js mehrere Versionen von unterstützt Abhängigkeiten.
Andy
15

Laden Sie die Quelle für ea. Paket. Installieren Sie jedes in einem eigenen Ordner. Zum Beispiel. Ich hatte ein Paket der Version 1.10, wollte aber für einige Arbeiten zur Entwicklerversion wechseln. Ich habe die Quelle für das Dev-Modul heruntergeladen: git clone https://github.com/networkx/networkx.git cd netwokrx Ich habe einen Ordner für diese Version erstellt: mkdir /home/username/opt/pythonund dann die PYTHONPATH-Umgebungsvariable auf: gesetzt export PYTHONPATH=/home/username/opt/python/lib/python2.7/site-packages/. Als nächstes habe ich es installiert mit:python setup.py install --prefix=/home/username/opt/python

Da mein PYTHONPATH jetzt auf diesen anderen Site-Package-Ordner verweist, funktioniert es, wenn ich Python in der Befehlszeile ausführe und das neue Modul importiere. Entfernen Sie den neuen Ordner aus PYTHONPATH, um den Switch zurückzuschalten.

>>> import networkx as nx
>>> nx.__version__
'2.0.dev_20151209221101'
sAguinaga
quelle
2
Hah, bin speziell hierher gekommen, weil ich gegen networkxVersionsunterschiede kämpfe !
Dwanderson
"Um den Schalter zurückzuschalten, entfernen Sie den neuen Ordner von PYTHONPATH.", Dieser Teil funktioniert nicht für mich, selbst nachdem der neue Ordnerpfad vonsys.path
Avinash Raj