Python: определить, работает ли внутри virtualenv

Можно ли определить, работает ли текущий script внутри виртуальной среды?

4b9b3361

AFAIK - самый надежный способ проверить это (и то, как он используется внутри virtualenv и в pip) - проверить наличие sys.real_prefix:

import sys

if hasattr(sys, 'real_prefix'):
    #...

Внутри virtualenv sys.prefix указывает на каталог virtualenv, а sys.real_prefix указывает на "реальный" префикс системы Python (часто /usr или /usr/local или некоторые такие).

Вне виртуального, sys.real_prefix не должно существовать.

Использование переменной среды VIRTUAL_ENV не является надежным. Он устанавливается оболочкой virtualenv activate script, но virtualenv можно использовать без активации, непосредственно запуская исполняемый файл из каталога virtualenv bin/ (или Scripts), и в этом случае $VIRTUAL_ENV не будет набор.

139
ответ дан 10 дек. '09 в 22:07
источник

Использование переменной $VIRTUAL_ENV действительно проверяет, находимся ли мы в виртуальной среде, но проблема может заключаться в деактивации функции, которая не очищает эту переменную, когда мы покидаем virtualenv.

15
ответ дан 08 февр. '15 в 1:17
источник

Попробуйте использовать pip -V (заметьте капитал V)

Если вы используете виртуальный env. он покажет путь к env. местоположение и др.

15
ответ дан 14 авг. '16 в 7:12
источник

Это улучшение принятого ответа Carl Meyer. Он работает с virtualenv для Python 3 и 2, а также для venv в Python 3:

import sys


def is_venv():
    return (hasattr(sys, 'real_prefix') or
            (hasattr(sys, 'base_prefix') and sys.base_prefix != sys.prefix))

Проверка на sys.real_prefix охватывает virtualenv, равенство непустого sys.base_prefix с sys.prefix охватывает venv.

Рассмотрим script, который использует такую ​​функцию:

if is_venv():
    print('inside virtualenv or venv')
else:
    print('outside virtualenv or venv')

И следующий вызов:

$ 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 
9
ответ дан 03 марта '17 в 16:26
источник

Я регулярно использую несколько виртуальных сред, установленных Anaconda (venv). Этот фрагмент кода/примеры позволяет определить, находитесь ли вы в вену (или в вашей системной среде), а также требуете определенного места для вашего script.

ДОБАВИТЬ В ПИТОН SCRIPT (фрагмент кода):

# ----------------------------------------------------------------------------
# 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/info/1871549/python-determine-if-running-inside-virtualenv  
# [ ... SNIP! ... ]

ЗАПУСТИТЬ ВАШ SCRIPT (примеры):

$ 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.  ;-)

Обновление: используйте в bash скриптах:

Вы также можете использовать этот подход в сценариях bash (например, те, которые должны выполняться в конкретной виртуальной среде). Пример (добавлен в bash script):

# ----------------------------------------------------------------------------
# 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 ... ]
0
ответ дан 18 окт. '16 в 6:35
источник

Это не пуленепробиваемый, но для сред UNIX простой тест, например

if run("which python3").find("venv") == -1:
    # something when not executed from venv

отлично работает для меня. Это проще, чем тестирование существующего атрибута, и, во всяком случае, вы должны называть свой каталог venv venv.

0
ответ дан 18 окт. '16 в 16:40
источник

В ОС Windows вы увидите что-то вроде этого:

C:\Users\yourusername\virtualEnvName\Scripts>activate
(virtualEnvName) C:\Users\yourusername\virtualEnvName\Scripts>

Скобки означают, что вы фактически находитесь в виртуальной среде, называемой virtualEnvName.

0
ответ дан 07 июля '17 в 17:58
источник

(отредактирован) Я так нашел, что вы думаете об этом? (он также возвращает базовый путь venv и работает даже для readthedocs, где проверка переменной env отсутствует):

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'] + '/../')
0
ответ дан 16 июля '17 в 10:26
источник