Frage

Kann festgestellt werden, ob das aktuelle Skript in einer Virtualenv-Umgebung ausgeführt wird?

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top