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.
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.gitcd 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'
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
packageX>=1.3,<2
undpackageX>=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.5
und alle wären glücklich. Weitere Details hierAntworten:
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.
quelle
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/python
und dann die PYTHONPATH-Umgebungsvariable auf: gesetztexport 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'
quelle
networkx
Versionsunterschiede kämpfe !sys.path