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

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

9 Solutions collect form web for “Python: определить, работает ли внутри virtualenv”

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

ДОБАВИТЬ К ПИФОНУ 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! ... ] 

ПРОВЕРЬТЕ СВОЙ СКРИПТ (примеры):

 $ 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! $ ## QED ;-) 

Обновление: использование в сценариях bash:

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

 # ---------------------------------------------------------------------------- # 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 ... ] 

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

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

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

(отредактированный) Я так нашел, что вы думаете об этом? (он также возвращает базовый путь 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'] + '/../') 
  • django postgres не удалось подключиться к серверу
  • Обновление виртуального виртуального Python?
  • Сломанные ссылки в Virtualenvs
  • Могу ли я автоматически изменить свой PYTHONPATH при активации / деактивации virtualenv?
  • ImportError: нет модуля с именем Crypto.Cipher
  • python: в чем разница между pythonbrew и virtualenv?
  • Установка Twisted through pip на одном сервере
  • Пакет Python установлен глобально, но не в virtualenv (PyGTK)
  • Python - лучший язык программирования в мире.