497 Stimmen

Feststellen, ob Python in virtualenv ausgeführt wird

Ist es möglich, festzustellen, ob das aktuelle Skript in einer Virtualenv-Umgebung ausgeführt wird?

343voto

Carl Meyer Punkte 113574

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.

276voto

loki l Punkte 2641

Versuchen Sie es mit pip -V (Großes V beachten)

Wenn Sie die virtuelle Umgebung ausführen, wird der Pfad zum Speicherort der Umgebung angezeigt.

98voto

hroncok Punkte 1097

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

93voto

MrHetii Punkte 1121

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.

52voto

florisla Punkte 10765

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 .

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X