Можно ли определить, работает ли текущий script внутри виртуальной среды?
Определите, работает ли Python внутри virtualenv
Ответ 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, проверьте Виктория Стюарт ответит.