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

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

Ответ 1

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 не будет набор.

Ответ 2

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

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

Ответ 3

Это улучшение принятого ответа Карла Мейера. Он работает с 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.

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

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 

Ответ 4

Проверьте переменную среды $VIRTUAL_ENV.

$VIRTUAL_ENV среды $VIRTUAL_ENV содержит каталог виртуальной среды в активной виртуальной среде.

>>> import os
>>> os.environ['VIRTUAL_ENV']
'/some/path/project/venv'

После запуска deactivate/выхода из виртуальной среды переменная $VIRTUAL_ENV будет очищена/пуста. Python вызовет KeyError потому что переменная окружения была не установлена.

>>> 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'

Те же самые проверки переменных среды, конечно, можно выполнять и вне скрипта Python в оболочке.

Ответ 5

В соответствии с virtualenv pep на http://www.python.org/dev/peps/pep-0405/#specification вы можете просто использовать sys.prefix вместо os.environ ['VIRTUAL_ENV'].

sys.real_prefix не существует в моем virtualenv и том же с sys.base_prefix.

Ответ 6

Вы можете сделать which python и посмотреть, указывает ли он на тот, что в виртуальной среде.

Ответ 7

Чтобы проверить, есть ли у вас внутри Virtualenv:

import os

if os.getenv('VIRTUAL_ENV'):
    print('Using Virtualenv')
else:
    print('Not using Virtualenv')

Вы также можете получить больше данных о вашей среде:

import sys
import os

print(f'Python Executable: {sys.executable}')
print(f'Python Version: {sys.version}')
print(f'Virtualenv: {os.getenv("VIRTUAL_ENV")}')

Ответ 8

Я регулярно использую несколько виртуальных сред, установленных 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/questions/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 ... ]

Ответ 9

Самый простой способ - просто запустить: which python, если вы в virtualenv, он будет указывать на свой питон вместо глобального

Ответ 10

(отредактирован) Я так нашел, что вы думаете об этом? (он также возвращает базовый путь 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'] + '/../')

Ответ 11

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

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

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

Ответ 12

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

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

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

Ответ 13

Потенциальное решение:

os.access(sys.executable, os.W_OK)

В моем случае я просто хотел определить, могу ли я устанавливать элементы с помощью pip как есть. Хотя это может быть не правильным решением для всех случаев, попробуйте просто проверить, есть ли у вас разрешения на запись для расположения исполняемого файла Python.

Примечание: это работает во всех версиях Python, но также возвращает True если вы запускаете системный Python с помощью sudo. Вот потенциальный вариант использования:

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'])

Ответ 14

Это старый вопрос, но приведенные выше примеры слишком сложны.

Сохраняйте это простым: (в Jupyter Notebook или терминале Python 3.7.1 в 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'

Ответ 15

Здесь уже опубликовано много отличных методов, но мы добавим еще один:

import site
site.getsitepackages()

сообщает вам, где pip установил пакеты.

Ответ 16

Здесь есть несколько хороших ответов, и некоторые менее надежные. Здесь обзор.

Как не сделать это

Не полагайтесь на расположение Python или папку site-packages.

Если они установлены в нестандартных местах, это не значит, вы на самом деле в виртуальной среде. Пользователи могут иметь более одного Установлена версия Python, и она не всегда там, где вы ожидаете.

Избегайте смотреть на:

  • sys.executable
  • sys.prefix
  • pip -V
  • which python

Кроме того, не проверяйте наличие venv, .venv или envs ни на одном из этих путей. Это сломается для сред с более уникальным местоположением. Например, Pipenv использует хеш-значения в качестве имени для своих сред.

VIRTUAL_ENV переменная окружения

virtualenv и venv устанавливают переменную среды $VIRTUAL_ENV при активации среды. См. PEP 405.

Вы можете прочитать эту переменную в сценариях оболочки или использовать этот код Python, чтобы определить, установлена ли она.

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"))

Проблема в том, что это работает только тогда, когда среда активируется сценарием оболочки activate.

Вы можете запустить сценарии среды без активации среды, так что если это Это проблема, вы должны использовать другой метод.

sys.real_prefix и sys.base_prefix

Virtualenv указывает sys.prefix на Python, установленный внутри virtualenv, как и следовало ожидать.

В то же время исходное значение sys.prefix также становится доступным в качестве нового атрибута sys: sys.real_prefix. Это то, что мы используем, чтобы определить, находимся ли мы в virtualenv.

import sys
running_in_virtualenv = hasattr(sys, "real_prefix")

Хотя есть проблема: venv и pyvenv делают это не так, как virtualenv - они этого не делают установить real_prefix. Вместо этого они устанавливают base_prefix значение, отличное от sys.prefix.

Чтобы быть в безопасности, отметьте оба варианта, как указано в ответе hroncok:

import sys

virtualenv_prefix = getattr(sys, "real_prefix", None)
venv_prefix = getattr(sys, "base_prefix", sys.prefix)

running_in_virtualenv = virtualenv_prefix or venv_prefix != sys.prefix

Anaconda

Если вы используете виртуальные среды Anacona, проверьте Виктория Стюарт ответит.