virtualenv --no-site-packages und pip finden immer noch globale pakete?

136

Ich hatte den Eindruck, dass virtualenv --no-site-packagesdies eine völlig separate und isolierte Python-Umgebung schaffen würde, aber es scheint nicht so.

Zum Beispiel habe ich Python-Django global installiert, möchte aber eine virtuelle Umgebung mit einer anderen Django-Version erstellen.

$ virtualenv --no-site-packages foo       
New python executable in foo/bin/python
Installing setuptools............done.
$ pip -E foo install Django
Requirement already satisfied: Django in /usr/share/pyshared
Installing collected packages: Django
Successfully installed Django

Soweit ich das beurteilen kann, soll das pip -E foo installoben Gesagte eine neue Version von Django neu installieren. Wenn ich pip anweise, die Umgebung einzufrieren, bekomme ich auch eine ganze Reihe von Paketen. Ich würde erwarten, dass für eine frische Umgebung damit --no-site-packagesdies leer wäre?

$ pip -E foo freeze
4Suite-XML==1.0.2
BeautifulSoup==3.1.0.1
Brlapi==0.5.3
BzrTools==1.17.0
Django==1.1
... and so on ...

Verstehe ich falsch, wie --no-site-packageses funktionieren soll?

ianw
quelle
4
Zu Ihrer Information , --no-site-packages wurden veraltet. Siehe hier
Salem Ben Mabrouk
@SalemBenMabrouk Link defekt, neuer Link hier. Verwandte Probleme bei Github: Ist das Flag '--no-site-packages' kürzlich verschwunden?
Ynjxsjmh
In diesem Link heißt es, --no-site-packagesist DEPRECATED. Wird nur aus Gründen der Abwärtskompatibilität beibehalten. Der fehlende Zugriff auf globale Site-Pakete ist jetzt das Standardverhalten . Wenn Sie auf globale Site-Pakete zugreifen möchten, können Sie diese aktivieren --system-site-packages.
Ynjxsjmh

Antworten:

107

Ich hatte ein solches Problem, bis mir klar wurde, dass ich (lange bevor ich virtualenv entdeckt hatte) dem PYTHONPATH in meiner .bashrc-Datei Verzeichnisse hinzugefügt hatte. Da es über ein Jahr zuvor gewesen war, habe ich nicht sofort daran gedacht.

wackelig_col
quelle
12
Mein Held! Wenn Sie nur schnell überprüfen möchten, ob dies Ihr Problem ist, können Sie printenv ausführen, um festzustellen, ob PYTHONPATH vorhanden ist. Wenn dies der Fall ist, führen Sie nicht festgelegtes PYTHONPATH aus. Sie müssen das Problem immer noch aufspüren, wenn das Problem nicht mehr auftreten soll. Dadurch können Sie jedoch eine neue virtuelle Umgebung in der aktuellen Shell-Sitzung einrichten.
UltraBob
Homebrew macht das auch!
Rob
1
Ich wünschte, ich könnte dich mehr unterstützen. Ich bin mehr als einmal auf diese Seite gekommen, nachdem ich auf Dinge gestoßen bin, die darauf zurückzuführen sind, dass mein PYTHONPATH bereits eingestellt ist.
Bemmu
Ich weiß, dass dies ein wirklich (wirklich) alter Beitrag ist, aber ich habe überall gesucht, einschließlich einiger meiner eigenen Fragen zu SO, und ich kann nicht herausfinden, wie ich --no-site-packageszur Arbeit komme . Ich bin kurz davor, Ubuntu abzuwischen und zu sehen, ob das die Dinge behebt. Ich dachte anfangs, dass ich das gleiche PYTHONPATH-Problem habe, aber beim Laufen printenvkann ich es nicht sehen. Die Frustration nimmt zu und jede Hilfe wird sehr geschätzt. Mein sys.path aus einem mit erstellten venv --no-site-packagesscheint alle meine Paketverzeichnisse zu enthalten. Ich habe nicht die geringste Ahnung, wie ich das ändern kann. Hilfe?
NotAnAmbiTurner
Dies kann auch für Ihre globale PATHVariable gelten, wenn Sie ausführbare Dateien auch außerhalb der virtuellen Umgebung finden.
Enderland
27

Sie müssen sicherstellen, dass Sie die pipBinärdatei in der von Ihnen erstellten virtuellen Umgebung ausführen, nicht in der globalen.

env/bin/pip freeze

Sehen Sie einen Test:

Wir erstellen die virtuelle Umgebung mit der --no-site-packagesOption:

$ virtualenv --no-site-packages -p /usr/local/bin/python mytest
Running virtualenv with interpreter /usr/local/bin/python
New python executable in mytest/bin/python
Installing setuptools, pip, wheel...done.

Wir überprüfen die Ausgabe freezeder neu erstellten pip:

$ mytest/bin/pip freeze
argparse==1.3.0
wheel==0.24.0

Aber wenn wir das Globale verwenden pip, bekommen wir Folgendes:

$ pip freeze
...
pyxdg==0.25
...
range==1.0.0
...
virtualenv==13.1.2

Das heißt, alle Pakete, pipdie im gesamten System installiert wurden. Durch Überprüfen erhalten which pipwir (zumindest in meinem Fall) so etwas wie /usr/local/bin/pip, was bedeutet, dass wenn wir dies tun pip freeze, diese Binärdatei anstelle von aufgerufen wird mytest/bin/pip.

fedorqui 'SO hör auf zu schaden'
quelle
Ich hatte das gleiche Problem. Ich frage mich, wie es passiert ist, da mir beim ersten Aufruf von pip freeze die richtigen Pakete
angezeigt wurden
1
Dies war das Problem für mich: Ich hatte einen Alias pipfür einen bestimmten Pfad zum globalen Pip, der beim Aktivieren der virtuellen Umgebung nicht überschrieben wurde.
MerlinND
1
Du hast mich gerade gerettet, das hat gut für mich funktioniert (pip3 & python3.7) Danke
Saed Yousef
24

Schließlich stellte ich fest, dass pip-E aus irgendeinem Grund nicht funktionierte. Wenn ich jedoch die virtuelle Umgebung tatsächlich aktiviere und easy_install von virtualenv verwende, um pip zu installieren, dann verwende pip direkt von innen, es scheint wie erwartet zu funktionieren und zeigt nur die Pakete in der virtuellen Umgebung an

ianw
quelle
2
FWIW, mit den aktuellen Trunk-Versionen von pip und virtualenv macht Ihr ursprünglicher Workflow jetzt das Richtige für mich. Trotzdem vermeide ich persönlich immer noch -E und installiere Pip einfach in jeder virtuellen Umgebung.
Carl Meyer
17

Ich weiß, dass dies eine sehr alte Frage ist, aber für diejenigen, die hier ankommen und nach einer Lösung suchen:

Vergessen Sie nicht, virtualenv ( source bin/activate) vor dem Ausführen zu aktivierenpip freeze . Andernfalls erhalten Sie eine Liste aller globalen Pakete.

Finspin
quelle
Vielen Dank dafür, ich wusste, dass ich Source mit virtualenv verwenden musste, aber nicht für virtualenvwrapper, und ich habe noch nie von Pip Freeze gehört.
Deepend
KORREKTE ANTWORT. Nach der Initialisierung von virtualenv müssen Sie es aktivieren, sonst verwenden Sie die Systemversion von Python
AsAP_Sherb
16

Löschen Sie vorübergehend das PYTHONPATHmit:

export PYTHONPATH=

Erstellen und aktivieren Sie dann die virtuelle Umgebung:

virtualenv foo
. foo/bin/activate

Nur dann:

pip freeze
Pedro Torres
quelle
15

--no-site-packagessollte, wie der Name schon sagt, das Standardverzeichnis für Site-Pakete aus entfernen sys.path. Alles andere, was im Standard-Python-Pfad lebt, bleibt dort.

Martin v. Löwis
quelle
1
Für mich schien das Reinigen meiner PYTHONPATHmit export PYTHONPATH=dem Trick zu tun.
Wacholder
4

Ein ähnliches Problem kann unter Windows auftreten, wenn Sie Skripte direkt aufrufen, script.pydie dann den Windows-Standardöffner verwenden und Python außerhalb der virtuellen Umgebung öffnen. Wenn Sie es mit aufrufen, python script.pywird Python in der virtuellen Umgebung verwendet.

odie5533
quelle
Am oberen Rand des Skripts sollte eine Shebang-Zeile stehen (beginnend mit '! #'), Die auf die zu verwendende Interpretation verweist.
Wobbily_col
2

Dies scheint auch zu passieren, wenn Sie das Verzeichnis virtualenv in ein anderes Verzeichnis (unter Linux) verschieben oder ein übergeordnetes Verzeichnis umbenennen.

pors
quelle
1

Ich hatte das gleiche Problem. Das Problem für mich (unter Ubuntu) war, dass mein Pfadname enthalten war $. Als ich eine virtuelle Umgebung außerhalb von $ dir erstellt habe, hat es gut funktioniert.

Seltsam.

NotAnAmbiTurner
quelle
1

Einer der möglichen Gründe, warum virtualenv pip nicht funktioniert, besteht darin, dass in einem der übergeordneten Ordner Speicherplatz in seinem Namen vorhanden war /Documents/project name/app , um /Documents/projectName/appdas Problem zu lösen.

Mabdrabo
quelle
1

Ich bin auf das gleiche Problem gestoßen, bei dem pip in venv immer noch als global pip funktioniert.
Nachdem ich viele Seiten durchsucht habe, finde ich es auf diese Weise heraus.
1. Erstellen Sie ein neues venv von virtualenv mit der Option "--no-site-packages".

virtualenv --no-site-packages --python=/xx/xx/bin/python my_env_nmae

Bitte beachten Sie, dass die Option "--no-site-packages" seit 1.7.0 in der Dokumentdatei von virtualenv standardmäßig true war, aber ich fand, dass sie nur funktioniert, wenn Sie sie manuell aktivieren. Um ein reines Venv zu erhalten, empfehle ich dringend, diese Option auf 2 zu setzen. Aktivieren Sie die neue Umgebung, die Sie erstellt haben

source ./my_env_name/bin/activate
  1. Überprüfen Sie Ihren Pip-Speicherort und Ihren Python-Speicherort und stellen Sie sicher, dass sich diese beiden Befehle in einer virtuellen Umgebung befinden
pip --version
which python
  1. Verwenden Sie pip unter virtual env, um Pakete zu installieren, die frei von der globalen Paketunterbrechung sind
pip install package_name

Wünschte, diese Antwort hilft Ihnen!

Augustus
quelle
0

Hier ist die Liste aller pip installieren Optionen - ich keine ‚gefunden -E‘ Option sein kann ältere Version hatte. Im Folgenden teile ich eine einfache englische Verwendung und Arbeit virtualenvfür die kommenden SO-Benutzer.


Alles scheint in Ordnung zu sein, akzeptiere das Aktivieren von virtualenv( foo). Alles, was es tut, ist, dass wir mehrere (und unterschiedliche) Python-Umgebungen haben, dh verschiedene Python-Versionen oder verschiedene Django-Versionen oder jedes andere Python-Paket - falls wir eine frühere Version in der Produktion haben und die neueste Django-Version mit unserer testen möchten Anwendung.

Kurz gesagt, das Erstellen und Verwenden (Aktivieren) der virtuellen Umgebung ( virtualenv) ermöglicht das Ausführen oder Testen unserer Anwendung oder einfacher Python-Skripte mit verschiedenen Python-Interpretern, dh Python 2.7 und 3.3 - kann eine Neuinstallation (mit --no-site-packagesOption) oder alle vorhandenen Pakete sein / letztes Setup (mit --system-site-packagesOption). Um es zu benutzen, müssen wir es aktivieren:

$ pip install djangowird es in den globalen Site-Paketen installieren, und in ähnlicher Weise pip freezewerden die Namen der globalen Site-Pakete abgerufen.

Während der Ausführung im venv dir (foo) $ source /bin/activatewird venv aktiviert, dh jetzt wird alles, was mit pip installiert wurde, nur in der virtuellen Umgebung installiert, und erst jetzt gibt das Einfrieren von pip nicht die Liste der Python-Pakete globaler Site-Pakete an. Einmal aktiviert:

$ virtualenv --no-site-packages foo       
New python executable in foo/bin/python
Installing setuptools............done.
$ cd foo
$ source bin/activate 
(foo)$ pip install django

(foo)bevor das $Zeichen anzeigt, dass wir eine virtuelle Python-Umgebung verwenden, dh alles, was mit pip - install, freeze, deinstalliert wird, ist auf dieses venv beschränkt und hat keine Auswirkungen auf die globale / standardmäßige Python-Installation / Pakete.

Nabeel Ahmed
quelle