Kann festgestellt werden, ob das aktuelle Skript in einer virtuellen Umgebung ausgeführt wird?
Kann festgestellt werden, ob das aktuelle Skript in einer virtuellen Umgebung ausgeführt wird?
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
:
import sys
if hasattr(sys, 'real_prefix'):
#...
Zeigt in einem virtualenv sys.prefix
auf das Verzeichnis virtualenv und sys.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 vom activate
Shell-Skript virtualenv festgelegt , eine virtualenv kann jedoch ohne Aktivierung verwendet werden, indem eine ausführbare Datei direkt aus dem Verzeichnis bin/
(oder Scripts
) der virtualenv ausgeführt wird. In diesem Fall $VIRTUAL_ENV
wird sie nicht festgelegt.
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.
virtualenv
viel bewegt haben , ist es möglich, dass dies fehlschlägt oder Sie anlügt. Wenn es lügt, kannst du es tun find /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öschen find /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:
import sys
def is_venv():
return (hasattr(sys, 'real_prefix') or
(hasattr(sys, 'base_prefix') and sys.base_prefix != sys.prefix))
Die Prüfung auf sys.real_prefix
Cover Virtualenv, die Gleichheit von Nicht-Leer sys.base_prefix
mit sys.prefix
Cover Venv.
Stellen Sie sich ein Skript vor, das die folgende Funktion verwendet:
if is_venv():
print('inside virtualenv or venv')
else:
print('outside virtualenv or venv')
Und der folgende Aufruf:
$ 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
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.
>>> import os
>>> os.environ['VIRTUAL_ENV']
'/some/path/project/venv'
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.
>>> 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'
Dieselben Überprüfungen von Umgebungsvariablen können natürlich auch außerhalb des Python-Skripts in der Shell durchgeführt werden.
virtualenv
virtuelle als auch für eine virtuelle venv
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.
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:
import os
if os.getenv('VIRTUAL_ENV'):
print('Using Virtualenv')
else:
print('Not using Virtualenv')
Sie können auch mehr Daten zu Ihrer Umgebung abrufen:
import sys
import os
print(f'Python Executable: {sys.executable}')
print(f'Python Version: {sys.version}')
print(f'Virtualenv: {os.getenv("VIRTUAL_ENV")}')
Sie können tun which python
und sehen, ob es auf das in der virtuellen Umgebung zeigt.
which
ist unter Windows standardmäßig nicht verfügbar. Sie können where
stattdessen unter Windows verwenden oder whichcraft verwenden . Oder schau es dir an sys.executable
. Trotzdem gibt es bessere Methoden.
Hier gibt es mehrere gute und einige weniger robuste Antworten. Hier ist eine Übersicht.
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
oder envs
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
und venv
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.
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 von der aktiviert wirdactivate
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
Und pyvenv
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 gestellt sys.base_prefix
.
Damit können wir erkennen, ob wir uns in einer virtuellen Umgebung 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
sys.real_prefix
Nun pass auf, virtualenv
bevor Version 20 nicht eingestellt wurde, sys.base_prefix
sondern sys.real_prefix
stattdessen eingestellt wurde.
Um sicher zu gehen, überprüfen Sie beide, wie in der Antwort von hroncok vorgeschlagen :
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
Wenn Sie virtuelle Anaconda-Umgebungen verwenden, überprüfen Sie die Antwort von Victoria Stuart .
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):
# ----------------------------------------------------------------------------
# Want script to run in Python 3.5 (has required installed OpenCV, imutils, ... packages):
import os
# First, see if we are in a conda venv { py27: Python 2.7 | py35: Python 3.5 | tf: TensorFlow | thee : Theano }
try:
os.environ["CONDA_DEFAULT_ENV"]
except KeyError:
print("\tPlease set the py35 { p3 | Python 3.5 } environment!\n")
exit()
# If we are in a conda venv, require the p3 venv:
if os.environ['CONDA_DEFAULT_ENV'] != "py35":
print("\tPlease set the py35 { p3 | Python 3.5 } environment!\n")
exit()
# See also:
# Python: Determine if running inside virtualenv
# http://stackoverflow.com/questions/1871549/python-determine-if-running-inside-virtualenv
# [ ... SNIP! ... ]
Beispiel:
$ p2
[Anaconda Python 2.7 venv (source activate py27)]
(py27) $ python webcam_.py
Please set the py35 { p3 | Python 3.5 } environment!
(py27) $ p3
[Anaconda Python 3.5 venv (source activate py35)]
(py35) $ python webcam.py -n50
current env: py35
processing (live): found 2 faces and 4 eyes in this frame
threaded OpenCV implementation
num_frames: 50
webcam -- approx. FPS: 18.59
Found 2 faces and 4 eyes!
(py35) $
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):
if [ $CONDA_DEFAULT_ENV ] ## << note the spaces (important in BASH)!
then
printf 'venv: operating in tf-env, proceed ...'
else
printf 'Note: must run this script in tf-env venv'
exit
fi
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.
import os, re
try:
if re.search('py37', os.environ['VIRTUAL_ENV']):
pass
except KeyError:
print("\n\tPlease set the Python3 venv [alias: p3]!\n")
exit()
Hier ist ein erklärender Code.
[victoria@victoria ~]$ date; python --version
Thu 14 Nov 2019 11:27:02 AM PST
Python 3.8.0
[victoria@victoria ~]$ python
Python 3.8.0 (default, Oct 23 2019, 18:51:26)
[GCC 9.2.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import os, re
>>> re.search('py37', os.environ['VIRTUAL_ENV'])
<re.Match object; span=(20, 24), match='py37'>
>>> try:
... if re.search('py37', os.environ['VIRTUAL_ENV']):
... print('\n\tOperating in Python3 venv, please proceed! :-)')
... except KeyError:
... print("\n\tPlease set the Python3 venv [alias: p3]!\n")
...
Please set the Python3 venv [alias: p3]!
>>> [Ctrl-d]
now exiting EditableBufferInteractiveConsole...
[victoria@victoria ~]$ p3
[Python 3.7 venv (source activate py37)]
(py37) [victoria@victoria ~]$ python --version
Python 3.8.0
(py37) [victoria@victoria ~]$ env | grep -i virtual
VIRTUAL_ENV=/home/victoria/venv/py37
(py37) [victoria@victoria ~]$ python
Python 3.8.0 (default, Oct 23 2019, 18:51:26)
[GCC 9.2.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import os, re
>>> try:
... if re.search('py37', os.environ['VIRTUAL_ENV']):
... print('\n\tOperating in Python3 venv, please proceed! :-)')
... except KeyError:
... print("\n\tPlease set the Python3 venv [alias: p3]!\n")
...
Operating in Python3 venv, please proceed! :-)
>>>
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 globale
(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.):
import os
import sys
from distutils.sysconfig import get_config_vars
def get_venv_basedir():
"""Returns the base directory of the virtualenv, useful to read configuration and plugins"""
exec_prefix = get_config_vars()['exec_prefix']
if hasattr(sys, 'real_prefix') is False or exec_prefix.startswith(sys.real_prefix):
raise EnvironmentError('You must be in a virtual environment')
return os.path.abspath(get_config_vars()['exec_prefix'] + '/../')
Es gibt hier bereits viele großartige Methoden, aber nur eine weitere:
import site
site.getsitepackages()
Hier erfahren Sie, wo pip
die Pakete installiert sind.
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
if run("which python3").find("venv") == -1:
# something when not executed from venv
funktioniert gut für mich. Es ist einfacher, als vorhandene Attribute zu testen, und trotzdem sollten Sie Ihr venv-Verzeichnis benennen venv
.
Unter Windows sehen Sie ungefähr Folgendes:
C:\Users\yourusername\virtualEnvName\Scripts>activate
(virtualEnvName) C:\Users\yourusername\virtualEnvName\Scripts>
Klammern bedeuten, dass Sie sich tatsächlich in der virtuellen Umgebung "virtualEnvName" befinden.
Eine mögliche Lösung ist:
os.access(sys.executable, os.W_OK)
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ühren sudo
. Hier ist ein möglicher Anwendungsfall:
import os, sys
can_install_pip_packages = os.access(sys.executable, os.W_OK)
if can_install_pip_packages:
import pip
pip.main(['install', 'mypackage'])
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)
import sys
print(sys.executable)```
# example output: >> `C:\Anaconda3\envs\quantecon\python.exe`
OR
```sys.base_prefix```
# Example output: >> 'C:\\Anaconda3\\envs\\quantecon'
envs
in diesem Pfad zu überprüfen , funktioniert dies nicht mehr, wenn Sie von Anaconda nach virtualenv
oder wechseln pipenv
.