Kann festgestellt werden, ob das aktuelle Skript in einer virtuellen Umgebung ausgeführt wird?
python
virtualenv
miracle2k
quelle
quelle
Antworten:
AFAIK Der zuverlässigste Weg, dies zu überprüfen (und der Weg, der intern in virtualenv und in pip verwendet wird), besteht darin, zu überprüfen, ob
sys.real_prefix
:Zeigt in einem virtualenv
sys.prefix
auf das Verzeichnis virtualenv undsys.real_prefix
auf das "echte" Präfix des Python-Systems (häufig/usr
oder in ähnlicher Form/usr/local
).Außerhalb einer virtuellen Umgebung
sys.real_prefix
sollte nicht existieren.Die Verwendung der
VIRTUAL_ENV
Umgebungsvariablen ist nicht zuverlässig. Es wird vomactivate
Shell-Skript virtualenv festgelegt , eine virtualenv kann jedoch ohne Aktivierung verwendet werden, indem eine ausführbare Datei direkt aus dem Verzeichnisbin/
(oderScripts
) der virtualenv ausgeführt wird. In diesem Fall$VIRTUAL_ENV
wird sie nicht festgelegt.quelle
PYTHON_ENV=$(python -c "import sys; sys.stdout.write('1') if hasattr(sys, 'real_prefix') else sys.stdout.write('0')")
Versuchen Sie es mit
pip -V
(Notizkapital V)Wenn Sie die virtuelle Umgebung ausführen. Es wird der Pfad zum Standort der Umgebung angezeigt.
quelle
virtualenv
viel bewegt haben , ist es möglich, dass dies fehlschlägt oder Sie anlügt. Wenn es lügt, kannst du es tunfind /path/to/venv/ -type f -exec sed -ie "s:/old/path/to/venv:/path/to/venv:g" {} \+
. Wenn es fehlschlägt (ich habe "schlechte Marschalldaten"), müssen Sie die .pyc-Dateien mit löschenfind /path/to/venv -type f -name "*.pyc" -exec rm {} \+
(keine Sorge, sie werden automatisch neu erstellt)....\lib\site-packages
in der%PATH%
. In diesem Fall wird also ein falsches Positiv zurückgegeben.Dies ist eine Verbesserung der akzeptierten Antwort von Carl Meyer . Es funktioniert mit virtualenv für Python 3 und 2 sowie für das venv- Modul in Python 3:
Die Prüfung auf
sys.real_prefix
Cover Virtualenv, die Gleichheit von Nicht-Leersys.base_prefix
mitsys.prefix
Cover Venv.Stellen Sie sich ein Skript vor, das die folgende Funktion verwendet:
Und der folgende Aufruf:
quelle
def is_venv(): return hasattr(sys, 'real_prefix') or sys.base_prefix != sys.prefix
. Ich sag bloß'.pipenv
erstellten virtuellen Umgebungen nicht zu funktionieren .Überprüfen Sie die
$VIRTUAL_ENV
Umgebungsvariable.Die
$VIRTUAL_ENV
Umgebungsvariable enthält das Verzeichnis der virtuellen Umgebung in einer aktiven virtuellen Umgebung.Sobald Sie
deactivate
die virtuelle Umgebung ausführen / verlassen, wird die$VIRTUAL_ENV
Variable gelöscht / leer. Python löst a aus,KeyError
weil die Umgebungsvariable nicht gesetzt wurde.Dieselben Überprüfungen von Umgebungsvariablen können natürlich auch außerhalb des Python-Skripts in der Shell durchgeführt werden.
quelle
virtualenv
virtuelle als auch für eine virtuellevenv
Umgebung.Laut dem virtualenv pep unter http://www.python.org/dev/peps/pep-0405/#specification können Sie stattdessen einfach sys.prefix os.environ ['VIRTUAL_ENV'] verwenden.
Das sys.real_prefix ist in meiner virtuellen Umgebung nicht vorhanden und das gleiche gilt für sys.base_prefix.
quelle
sys.real_prefix
.env |grep VIRTUAL_ENV |wc -l
Wenn in einem Venv eine 1 oder wenn nicht, eine 0 zurückgegeben wird.[[ -n $VIRTUAL_ENV ]] && echo virtualenv
oder[[ -z $VIRTUAL_ENV ]] && echo not virtualenv
je nach Ihren Anforderungen verwenden.So überprüfen Sie, ob Sie sich in Virtualenv befinden:
Sie können auch mehr Daten zu Ihrer Umgebung abrufen:
quelle
Sie können tun
which python
und sehen, ob es auf das in der virtuellen Umgebung zeigt.quelle
which
ist unter Windows standardmäßig nicht verfügbar. Sie könnenwhere
stattdessen unter Windows verwenden oder whichcraft verwenden . Oder schau es dir ansys.executable
. Trotzdem gibt es bessere Methoden.Hier gibt es mehrere gute und einige weniger robuste Antworten. Hier ist eine Übersicht.
Wie man es nicht macht
Verlassen Sie sich nicht auf den Speicherort von Python oder den
site-packages
Ordner.Wenn diese auf nicht standardmäßige Speicherorte festgelegt sind, bedeutet dies nicht, dass Sie sich tatsächlich in einer virtuellen Umgebung befinden. Benutzer können mehr als eine Python-Version installiert haben, und diese sind nicht immer dort, wo Sie sie erwarten.
Vermeiden Sie:
sys.executable
sys.prefix
pip -V
which python
Überprüfen Sie auch nicht auf das Vorhandensein von
venv
,.venv
oderenvs
in einem dieser Wege. Dies wird für Umgebungen mit einem eindeutigeren Standort unterbrochen. Zum Beispiel Pipenv verwendet Hash - Werte als Namen für seine Umgebungen.VIRTUAL_ENV
UmgebungsvariableBeides
virtualenv
undvenv
legen Sie die Umgebungsvariable fest,$VIRTUAL_ENV
wenn Sie eine Umgebung aktivieren. Siehe PEP 405 .Sie können diese Variable in Shell-Skripten auslesen oder diesen Python-Code verwenden, um festzustellen, ob sie festgelegt ist.
Das Problem ist, dass dies nur funktioniert, wenn die Umgebung von der aktiviert wird
activate
Shell-Skript .Sie können die Skripts der Umgebung starten, ohne die Umgebung zu aktivieren. Wenn dies ein Problem darstellt, müssen Sie eine andere Methode verwenden.
sys.base_prefix
virtualenv
,venv
Undpyvenv
Punktsys.prefix
auf den Python innerhalb des virtualenv installiert , wie man erwarten würde.Gleichzeitig wird der ursprüngliche Wert von
sys.prefix
auch als zur Verfügung gestelltsys.base_prefix
.Damit können wir erkennen, ob wir uns in einer virtuellen Umgebung befinden.
Zurückfallen:
sys.real_prefix
Nun pass auf,
virtualenv
bevor Version 20 nicht eingestellt wurde,sys.base_prefix
sondernsys.real_prefix
stattdessen eingestellt wurde.Um sicher zu gehen, überprüfen Sie beide, wie in der Antwort von hroncok vorgeschlagen :
Anakonda
Wenn Sie virtuelle Anaconda-Umgebungen verwenden, überprüfen Sie die Antwort von Victoria Stuart .
quelle
running_in_virtualenv = sys.*base_*prefix != sys.prefix
if hasattr(sys, 'real_prefix'):
Test verlassen, der nicht mehr funktionierte.Ich verwende routinemäßig mehrere von Anaconda installierte virtuelle Umgebungen (venv). Mit diesem Code-Snippet / diesen Beispielen können Sie feststellen, ob Sie sich in einem Venv (oder Ihrer Systemumgebung) befinden oder nicht, und außerdem ein bestimmtes Venv für Ihr Skript benötigen.
Zum Python-Skript hinzufügen (Code-Snippet):
Beispiel:
Update 1 - Verwendung in Bash-Skripten:
Sie können diesen Ansatz auch in Bash-Skripten verwenden (z. B. solche, die in einer bestimmten virtuellen Umgebung ausgeführt werden müssen). Beispiel (zum Bash-Skript hinzugefügt):
Update 2 [November 2019]
Seit meinem ursprünglichen Beitrag bin ich von Anaconda venv weitergezogen (und Python selbst hat sich nämlich weiterentwickelt virtuelle Umgebungen entwickelt).
Wenn Sie dieses Problem erneut untersuchen, finden Sie hier einen aktualisierten Python-Code, den Sie einfügen können, um zu testen, ob Sie in einer bestimmten virtuellen Python-Umgebung (venv) arbeiten.
Hier ist ein erklärender Code.
quelle
Am einfachsten ist es, einfach auszuführen:
which python
Wenn Sie sich in einer virtuellen Umgebung befinden, zeigt diese auf ihre Python anstatt auf die globalequelle
(bearbeitet) Ich habe so gefunden, was denkst du darüber? (Es gibt auch den venv-Basispfad zurück und funktioniert sogar für Readthedocs, bei denen das Überprüfen der env- Variablen nicht funktioniert.):
quelle
Es gibt hier bereits viele großartige Methoden, aber nur eine weitere:
Hier erfahren Sie, wo
pip
die Pakete installiert sind.quelle
site.getsitepackages()
ein Verzeichnis ausgegeben wird, das nicht das Systemverzeichnis ist, können Sie daraus schließen, dass Sie sich in einer virtuellen Umgebung befinden.virtualenv
.venv
Sie verwenden.Es ist nicht kugelsicher, aber für UNIX-Umgebungen einfach zu testen
funktioniert gut für mich. Es ist einfacher, als vorhandene Attribute zu testen, und trotzdem sollten Sie Ihr venv-Verzeichnis benennen
venv
.quelle
Unter Windows sehen Sie ungefähr Folgendes:
Klammern bedeuten, dass Sie sich tatsächlich in der virtuellen Umgebung "virtualEnvName" befinden.
quelle
Eine mögliche Lösung ist:
In meinem Fall wollte ich wirklich nur herausfinden, ob ich Elemente mit Pip so wie sie sind installieren kann. Obwohl dies möglicherweise nicht in allen Fällen die richtige Lösung ist, sollten Sie einfach prüfen, ob Sie über Schreibberechtigungen für den Speicherort der ausführbaren Python-Datei verfügen.
Hinweis: Dies funktioniert in allen Versionen von Python, wird jedoch auch zurückgegeben,
True
wenn Sie das System Python mit ausführensudo
. Hier ist ein möglicher Anwendungsfall:quelle
Dies ist eine alte Frage, aber zu viele Beispiele oben sind zu kompliziert.
Halten Sie es einfach: (in Jupyter Notebook oder Python 3.7.1 Terminal unter Windows 10)
quelle
envs
in diesem Pfad zu überprüfen , funktioniert dies nicht mehr, wenn Sie von Anaconda nachvirtualenv
oder wechselnpipenv
.