Stellen Sie fest, ob Python in virtualenv ausgeführt wird
-
18-09-2019 - |
Frage
Kann festgestellt werden, ob das aktuelle Skript in einer Virtualenv-Umgebung ausgeführt wird?
Lösung
AFAIK ist die zuverlässigste Methode, dies zu überprüfen (und die Art und Weise, die intern in Virtualenv und in Pip verwendet wird), die Existenz von zu überprüfen sys.real_prefix
:
import sys
if hasattr(sys, 'real_prefix'):
#...
In einer virtuellen Umgebung, sys.prefix
zeigt auf das Virtualenv-Verzeichnis und sys.real_prefix
verweist auf das „echte“ Präfix des Systems Python (oft /usr
oder /usr/local
oder so).
Außerhalb einer virtuellen Umgebung, sys.real_prefix
sollte nicht existieren.
Verwendung der VIRTUAL_ENV
Umgebungsvariable ist nicht zuverlässig.Es wird von der virtuellen Umgebung festgelegt activate
Shell-Skript, aber eine virtuelle Umgebung kann ohne Aktivierung verwendet werden, indem eine ausführbare Datei direkt von der virtuellen Umgebung ausgeführt wird bin/
(oder Scripts
)-Verzeichnis, in diesem Fall $VIRTUAL_ENV
wird nicht gesetzt.
Andere Tipps
Versuchen pip -V
(Hinweis Kapital V) mit
Wenn Sie die virtuelle env ausgeführt werden. es wird den Weg zum env zeigt. Standort.
Dies ist eine Verbesserung der akzeptierten Antwort von Carl Meyer . Es arbeitet 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))
Die Prüfung auf sys.real_prefix
deckt virtualenv, die Gleichheit nicht leer sys.base_prefix
mit sys.prefix
deckt Venv.
ein Skript berücksichtigen, dass die Funktion wie folgt 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
Überprüfen Sie die $VIRTUAL_ENV
Umgebungsvariable.
Die $VIRTUAL_ENV
Umgebungsvariable enthält das Verzeichnis der virtuellen Umgebung, wenn sie in einer aktiven virtuellen Umgebung.
>>> import os
>>> os.environ['VIRTUAL_ENV']
'/some/path/project/venv'
Wenn Sie deactivate
laufen / verlassen die virtuelle Umgebung, die $VIRTUAL_ENV
Variable wird gelöscht / leer werden. Python wird ein KeyError
erhöhen, 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'
Diese gleichen Umgebungsvariablen Kontrollen können natürlich auch außerhalb des Python-Skript ausgeführt werden, in der Schale.
Nach dem virtualenv pep unter http://www.python.org/dev/peps/ pep-0405 / # Spezifikation nur sys.prefix statt os.environ [ 'VIRTUAL_ENV'] verwenden kann.
die sys.real_prefix existiert nicht in meinem virtualenv und gleicht mit sys.base_prefix.
Sie können which python
tun und wenn sie zeigt auf den in virtuellen env sehen.
Um zu überprüfen, ob Ihre innen virtualenv:
import os
if os.getenv('VIRTUAL_ENV'):
print('Using Virtualenv')
else:
print('Not using Virtualenv')
Sie können auch mehr Daten auf Ihrer Umgebung erhalten:
import sys
import os
print(f'Python Executable: {sys.executable}')
print(f'Python Version: {sys.version}')
print(f'Virtualenv: {os.getenv("VIRTUAL_ENV")}')
ich routinemäßig mehrere Anaconda installierten virtuellen Umgebungen (Venv). Dieser Code-Schnipsel / Beispiele können Sie feststellen, ob Sie in einem Venv (oder Systemumgebung) sind, und auch eine bestimmte Venv für Ihren Skript benötigen.
ADD TO Python-Skript (Code-Schnipsel):
# ----------------------------------------------------------------------------
# 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! ... ]
RUN Skript (Beispiele):
$ python webcam_cv3_v2_fps_v2c.py -n50
Please set the py35 { p3 | Python 3.5 } environment!
$ thee
[Theano in Anaconda Python 2.7 venv (source activate theano-env)]
(theano-env) $ python webcam_cv3_v2_fps_v2c.py -n50
Please set the py35 { p3 | Python 3.5 } environment!
(theano-env) $ tf
[TensorFlow in Anaconda Python 2.7 venv (source activate tf-env]
(tf-env) $ python webcam_cv3_v2_fps_v2c.py -n50
Please set the py35 { p3 | Python 3.5 } environment!
(tf-env) $ p2
[Anaconda Python 2.7 venv (source activate py27)]
(py27) $ python webcam_cv3_v2_fps_v2c.py -n50
Please set the py35 { p3 | Python 3.5 } environment!
(py27) $ p3
[Anaconda Python 3.5 venv (source activate py35)]
(py35) $ python webcam_cv3_v2_fps_v2c.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) $ sd
[Anaconda venv deactivate (source deactivate)]
$ python webcam_cv3_v2_fps_v2c.py -n50
Please set the py35 { p3 | Python 3.5 } environment!
$ ## Q.E.D. ;-)
Update: Verwenden Sie in Bash-Skripte:
Sie können auch diesen Ansatz in Bash-Skripte (zum Beispiel solche, die in einer bestimmten virtuellen Umgebung ausgeführt werden müssen). Beispiel (hinzugefügt Bash-Skript):
# ----------------------------------------------------------------------------
# Excerpt from: /mnt/Vancouver/Programming/scripts/tf_tb_del.sh ## tf_tb_del: tf_tensorboard_delete
# [bash script run on command-line: calls TensorFlow-related commands, therefore must be run in tf-env venv]
if [ $CONDA_DEFAULT_ENV ] ## << note the spaces (important in bash)!
then
printf '\n\tvenv: tf-env\n'
else
printf '\n\n\t*******************************************************************\n'
printf '\t*** NOTE! Must run this script in tf-env virtual environment! ***\n'
printf '\t*******************************************************************'
exit
fi
## [ ... snip ... ]
Die einfachste Weg ist, einfach auszuführen: which python
, wenn Sie in einem virtualenv sind, wird es statt dem global man seinen Python Punkt
(herausgegeben) ich auf diese Weise gefunden, was halten Sie davon? (Es gibt auch den Venv Basispfad und funktioniert auch für readthedocs , wo die Überprüfung des env Variable nicht):
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 ist nicht kugelsicher, aber für UNIX-Umgebungen einfachen Test wie
if run("which python3").find("venv") == -1:
# something when not executed from venv
funktioniert gut für mich. Es ist einfacher, dann testet bestehende einiges Attribut und sowieso Sie Venv Verzeichnis venv
nennen sollten.
In Windows-Betriebssystem Sie sehen etwas wie folgt aus:
C:\Users\yourusername\virtualEnvName\Scripts>activate
(virtualEnvName) C:\Users\yourusername\virtualEnvName\Scripts>
Klammern bedeuten, dass Sie tatsächlich in der virtuellen Umgebung namens „virtualEnvName“ sind.
A Potential Lösung ist:
os.access(sys.executable, os.W_OK)
In meinem Fall habe ich wirklich wollte nur erkennen, wenn ich Elemente mit pip installieren könnte, wie ist. Während es nicht die richtige Lösung für alle Fälle sein könnte, sollten Sie einfach überprüfen, ob Sie Schreibberechtigungen für den Speicherort des Python ausführbaren haben.
Hinweis: das funktioniert in allen Versionen von Python, aber auch wieder True
wenn Sie das System Python mit sudo
laufen. 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.
Keep It Simple: (in Jupyter Notebook oder Python 3.7.1 Terminal auf 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'
Es gibt bereits viele gute Methoden, die hier gepostet, aber nur eine Zugabe von mehr:
import site
site.getsitepackages()
sagt Ihnen, wo pip
die Pakete installiert.