Lassen Sie virtualenv bestimmte Pakete von Ihren globalen Site-Paketen erben

208

Ich suche nach einer Möglichkeit, eine virtuelle Umgebung zu erstellen, die nur einige Bibliotheken (die ich ausgewählt habe) der Basis-Python-Installation enthält.

Um genauer zu sein, versuche ich, meine matplotlib während der Erstellung von virtualenv in virtualenv zu importieren. Es kann nicht effizient mit pip oder easy_install installiert werden, da einige fortran-Compiler-Bibliotheken fehlen. Die Art und Weise, wie ich es bis jetzt gemacht habe, war manuell zu kopieren

/usr/lib/python2.7/dist-packages/ to virtualenv_name/lib/python2.7/dist-packages/

Dies verhindert jedoch, dass die manuell importierten Links von yolk registriert werden (wodurch alle derzeit verfügbaren Bibliotheken in virtualenv gedruckt werden).

Gibt es also eine Möglichkeit, eine selektive Variante des zu erstellen?

virtualenv --system-site-packages
TheMeaningfulEngineer
quelle
16
eine sanfte Erinnerung - bitte wählen Sie eine Antwort aus, wenn eine der folgenden Antworten zu funktionieren scheint.
Foobarbecue
1
Es sieht so aus, als hätten 12 Personen in den letzten Monaten für Sie getestet ...
Foobarbecue
2
Warum das OP belästigen? Wir können alle sehen, welche die beliebteste Antwort ist; Ist es wirklich wichtig, ob er es akzeptiert? Ich denke, seine Integrität beim Testen für sich selbst sollte bewundert werden, anstatt nur die beliebteste Antwort anzukreuzen.
Michael Scheper
5
2013: Die Antwortwerte zwischen richtigen und falschen Antworten sind ziemlich ähnlich. OP sagt, er wird testen. 2016: Michael Scheper ist so beeindruckt, dass OP (vor drei Jahren) sagte, er würde testen. 2017: Ich stoße wieder auf diese Frage und bin amüsiert.
Foobarbecue
2
Es gibt keine richtige Antwort. OP bat um selektive --system-site-packages. Answers schlägt vor, --system-site-packageseinige Pakete nicht selektiv zu verwenden und dann lokal zu überinstallieren, was anders ist und unterschiedliche Auswirkungen hat.
Piotr Jurkiewicz

Antworten:

238

Erstellen Sie die Umgebung mit virtualenv --system-site-packages. Dann aktivieren Sie die virtualenv und wenn Sie die Dinge in der virtualenv installiert werden sollen , anstatt das System Python, verwenden pip install --ignore-installedoder pip install -I. Auf diese Weise installiert pip das, was Sie angefordert haben, lokal, obwohl eine systemweite Version vorhanden ist. Ihr Python-Interpreter sucht zuerst im Paketverzeichnis von virtualenv, daher sollten diese Pakete die globalen Pakete beschatten.

Foobarbecue
quelle
45
Mit -I installieren Sie Pakete immer neu, auch wenn sie bereits im systemweiten Verzeichnis der Site-Pakete vorhanden sind. Wenn Sie stattdessen -U verwenden, werden neuere Versionen von Paketen in Ihrer virtuellen Umgebung installiert, es werden jedoch keine Pakete neu installiert, die bereits im System mit der erforderlichen Version verfügbar sind.
Danilo Bargen
15
Wissen Sie, ob es eine Möglichkeit gibt, die Option --system-site-packages in einer zuvor erstellten virtuellen Umgebung zu aktivieren? Ich würde gerne den Aufwand vermeiden, alle meine lokalen Pakete neu zu installieren!
Gabriel
Ich fand diese Antwort sehr interessant, hatte jedoch einen sehr seltsamen Fall, in dem es nicht funktionierte. Ich habe eine virtuelle Umgebung mit no-global-site-packagesaktiviert. Aber aus irgendeinem Grund weiß ich nicht, dass es ein Paket gab, das vom globalen System verwendet wurde. Die Verwendung pip install -Ifür das Paket innerhalb der virtuellen Umgebung hat nicht funktioniert. Schließlich habe ich das Paket vorübergehend sowohl vom virtuellen als auch vom globalen System deinstalliert. Dann konnte ich es wieder im virtuellen und im System installieren (in dieser Reihenfolge). Also jetzt funktioniert es gut.
Kstenger
3
-1 In der Frage wird darum gebeten, bestimmte Pakete sichtbar zu machen, nicht alle außer schattierten Paketen. Das Whitelisting eines begrenzten Satzes wäre viel sicherer als das Whitelisting aller Elemente, da dadurch garantiert werden kann, dass alle Pakete mit Ausnahme der explizit auf der Whitelist aufgeführten Pakete im Venv vorhanden sein müssen.
bluenote10
19

Sie können das verwenden --system-site-packagesund dann das spezifische Material für Ihre virtuelle Umgebung "überinstallieren". Auf diese Weise wird alles, was Sie in Ihre virtuelle Umgebung installieren, von dort übernommen, andernfalls wird es von Ihrem System übernommen.

Schacki
quelle
Ich bin mir nicht ganz sicher, was unklar ist, werde es aber versuchen: Wenn Sie eine virtuelle Umgebung mit der Option --system-site-packages erstellen, versucht das System zuerst, Pakete in Ihrer virtuellen Umgebung zu finden. Wenn es sie dort nicht findet, wird es dies tun Versuchen Sie, es in Ihrer System-Python-Installation zu finden. Nur wenn es dort auch nicht gefunden wird, wird es ausgelöst und ImportError.
Schacki
4
Das einzige Problem bei diesem Ansatz ist, dass Sie jetzt alle Systembibliotheken haben. Wo Sie möglicherweise eine sehr strenge Kontrolle über die Installation wünschen.
Dwayne
7
Unklar ist, wie das eigentlich möglich ist! Wenn Sie myprog in einer virtuellen Umgebung installieren, die mit --system-site-packages erstellt wurde, in denen myprog im System vorhanden ist, wird myprog nicht "überinstalliert". Es wird nur festgestellt, dass myprog existiert, und "Anforderung bereits erfüllt" sagen. Also ... was hast du gemeint?
Foobarbecue
-5

Installieren Sie die virtuelle Umgebung mit

virtualenv --system-site-packages

und verwenden pip install -U to install matplotlib

Eder Martins
quelle
3
Dies ist das Gegenteil von dem, was die Frage gestellt hat.
Dan Getz
-7

Sie können verwenden virtualenv --clear. die keine Pakete installieren, dann installieren Sie die gewünschten.

Brandon Poole
quelle
Dies ist keine Antwort auf die eigentliche Frage, wie einige systemweite Pakete verwendet werden können
MrLeeh