Ist es möglich, festzustellen, ob das aktuelle Skript in einer Virtualenv-Umgebung ausgeführt wird?
Antworten
Zu viele Anzeigen?Die zuverlässigste Methode, dies zu überprüfen, ist, zu prüfen, ob sys.prefix == sys.base_prefix
. Wenn sie gleich sind, befinden Sie sich nicht in einer virtuellen Umgebung; wenn sie ungleich sind, sind Sie es. Innerhalb einer virtuellen Umgebung, sys.prefix
verweist auf die virtuelle Umgebung, und sys.base_prefix
ist das Präfix des Systems Python, aus dem die virtuelle Umgebung erstellt wurde.
Das obige funktioniert immer für Python 3 stdlib venv
und für die jüngsten virtualenv
(seit Version 20). Ältere Versionen von virtualenv
gebraucht sys.real_prefix
anstelle von sys.base_prefix
(und sys.real_prefix
außerhalb einer virtuellen Umgebung nicht existierte), und in Python 3.3 und früher sys.base_prefix
hat nie existiert. Eine robuste Prüfung, die alle diese Fälle abdeckt, könnte also wie folgt aussehen:
import sys
def get_base_prefix_compat():
"""Get base/real prefix, or sys.prefix if there is none."""
return getattr(sys, "base_prefix", None) or getattr(sys, "real_prefix", None) or sys.prefix
def in_virtualenv():
return get_base_prefix_compat() != sys.prefix
Wenn Sie sich nur für die unterstützten Python-Versionen und die neuesten virtualenv
können Sie ersetzen get_base_prefix_compat()
mit einfach sys.base_prefix
.
Die Verwendung des VIRTUAL_ENV
Umgebungsvariable ist nicht zuverlässig. Sie wird von der Virtualenv gesetzt activate
Shell-Skript, aber eine Virtualenv kann ohne Aktivierung verwendet werden, indem eine ausführbare Datei direkt aus der Virtualenv bin/
(oder Scripts
), in welchem Fall $VIRTUAL_ENV
wird nicht gesetzt. Oder eine nicht-virtualenv Python-Binärdatei kann direkt ausgeführt werden, während eine virtualenv in der Shell aktiviert ist; in diesem Fall $VIRTUAL_ENV
kann in einem Python-Prozess gesetzt werden, der nicht in dieser virtuellen Umgebung läuft.
Dies ist eine Verbesserung der akzeptierten Antwort von Carl Meyer . Es funktioniert mit virtualenv für Python 3 und 2 und auch für die venv Modul in Python 3:
import sys
def is_venv():
return (hasattr(sys, 'real_prefix') or
(hasattr(sys, 'base_prefix') and sys.base_prefix != sys.prefix))
Der Scheck für sys.real_prefix
umfasst virtualenv, die Gleichheit der nicht leeren sys.base_prefix
con sys.prefix
deckt venv.
Stellen Sie sich ein Skript vor, das die Funktion wie folgt verwendet:
if is_venv():
print('inside virtualenv or venv')
else:
print('outside virtualenv or venv')
Und die folgende Aufforderung:
$ python2 test.py
outside virtualenv or venv
$ python3 test.py
outside virtualenv or venv
$ python2 -m virtualenv virtualenv2
...
$ . virtualenv2/bin/activate
(virtualenv2) $ python test.py
inside virtualenv or venv
(virtualenv2) $ deactivate
$ python3 -m virtualenv virtualenv3
...
$ . virtualenv3/bin/activate
(virtualenv3) $ python test.py
inside virtualenv or venv
(virtualenv3) $ deactivate
$ python3 -m venv venv3
$ . venv3/bin/activate
(venv3) $ python test.py
inside virtualenv or venv
(venv3) $ deactivate
Prüfen Sie die $VIRTUAL_ENV
Umgebungsvariable.
En $VIRTUAL_ENV
Umgebungsvariable enthält das Verzeichnis der virtuellen Umgebung, wenn sie sich in einer aktiven virtuellen Umgebung befindet.
>>> import os
>>> os.environ['VIRTUAL_ENV']
'/some/path/project/venv'
Sobald Sie die deactivate
/ die virtuelle Umgebung verlassen, wird die $VIRTUAL_ENV
wird die Variable gelöscht/leer. Python löst eine KeyError
weil die Umgebungsvariable nicht gesetzt war.
>>> import os
>>> os.environ['VIRTUAL_ENV']
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/local/Cellar/python/3.7.3/Frameworks/Python.framework/Versions/3.7/lib/python3.7/os.py", line 678, in __getitem__
raise KeyError(key) from None
KeyError: 'VIRTUAL_ENV'
Die gleichen Prüfungen der Umgebungsvariablen können natürlich auch außerhalb des Python-Skripts in der Shell durchgeführt werden.
Hier gibt es mehrere gute Antworten, aber auch einige weniger gute. Hier ist ein Überblick.
Wie man es nicht macht
Verlassen Sie sich nicht auf den Standort von Python oder die site-packages
Ordner.
Wenn diese auf nicht standardisierte Orte eingestellt sind, bedeutet dies pas Mittelwert Sie befinden sich tatsächlich in einer virtuellen Umgebung. Benutzer können mehr als eine Python-Version installiert haben, und diese sind nicht immer dort, wo man sie erwartet.
Vermeiden Sie das Anschauen:
sys.executable
sys.prefix
pip -V
which python
Prüfen Sie auch nicht auf das Vorhandensein von venv
, .venv
o envs
auf einem dieser Pfade. Dies gilt nicht für Umgebungen mit einem eindeutigen Standort. Zum Beispiel, Pipenv verwendet Hash-Werte als Namen für seine Umgebungen.
VIRTUAL_ENV
Umgebungsvariable
Beide virtualenv
y venv
die Umgebungsvariable setzen $VIRTUAL_ENV
beim Aktivieren einer Umgebung. Siehe PEP 405 .
Sie können diese Variable in Shell-Skripten auslesen oder diesen Python-Code verwenden, um festzustellen, ob sie gesetzt ist.
import os
running_in_virtualenv = "VIRTUAL_ENV" in os.environ
# alternative ways to write this, also supporting the case where
# the variable is set but contains an empty string to indicate
# 'not in a virtual environment':
running_in_virtualenv = bool(os.environ.get("VIRTUAL_ENV"))
running_in_virtualenv = bool(os.getenv("VIRTUAL_ENV"))
Das Problem ist, dass dies nur funktioniert, wenn die Umgebung aktiviert durch die activate
Shell-Skript.
Sie können die Skripte der Umgebung starten ohne die Umwelt zu aktivieren Wenn das ein Problem ist, müssen Sie also eine andere Methode anwenden.
sys.base_prefix
virtualenv
, venv
y pyvenv
Punkt sys.prefix
zu dem in der Virtualenv installierten Python, wie Sie es erwarten würden.
Gleichzeitig ist die Original Wert von sys.prefix
wird auch zur Verfügung gestellt als sys.base_prefix
.
Damit können wir feststellen, ob wir uns in einer Virtualenv befinden.
import sys
# note: Python versions before 3.3 don't have sys.base_prefix
# if you're not in virtual environment
running_in_virtualenv = sys.prefix != sys.base_prefix
Rückfall: sys.real_prefix
Und jetzt aufgepasst, virtualenv
vor Version 20 nicht gesetzt sys.base_prefix
aber es setzte sys.real_prefix
stattdessen.
Um sicherzugehen, sollten Sie also beides überprüfen, wie es in hroncoks Antwort :
import sys
real_prefix = getattr(sys, "real_prefix", None)
base_prefix = getattr(sys, "base_prefix", sys.prefix)
running_in_virtualenv = (base_prefix or real_prefix) != sys.prefix
Anaconda
Wenn Sie virtuelle Umgebungen von Anaconda verwenden, überprüfen Sie Antwort von Victoria Stuart .
- See previous answers
- Weitere Antworten anzeigen