Можно ли определить, работает ли текущий скрипт в среде virtualenv?
python
virtualenv
miracle2k
источник
источник
Ответы:
AFAIK самый надежный способ проверить это (и способ, который используется внутренне в virtualenv и в pip) - это проверить наличие
sys.real_prefix
:Внутри virtualenv,
sys.prefix
указывает на каталог virtualenv, иsys.real_prefix
указывает на «реальной» префиксом системы Python (часто/usr
или/usr/local
или некоторые такие).Вне виртуальности
sys.real_prefix
не должно существовать.Использование
VIRTUAL_ENV
переменной окружения ненадежно. Он устанавливаетсяactivate
сценарием оболочки virtualenv , но virtualenv можно использовать без активации, напрямую запустив исполняемый файл из каталога virtualenvbin/
(илиScripts
), в этом случае$VIRTUAL_ENV
он не будет установлен.источник
PYTHON_ENV=$(python -c "import sys; sys.stdout.write('1') if hasattr(sys, 'real_prefix') else sys.stdout.write('0')")
Попробуйте использовать
pip -V
(обратите внимание, заглавная V)Если вы работаете в виртуальной среде. это покажет путь к местоположению env.
источник
virtualenv
, возможно, это может не сработать или обманывать вас. Если он врет, вы можете сделатьfind /path/to/venv/ -type f -exec sed -ie "s:/old/path/to/venv:/path/to/venv:g" {} \+
. Если это не удастся (я получил «неверные данные маршала»), вам нужно будет стереть файлы .pycfind /path/to/venv -type f -name "*.pyc" -exec rm {} \+
(не волнуйтесь, они восстановятся автоматически)....\lib\site-packages
в%PATH%
. Таким образом, он вернет ложное срабатывание в этом случае.Это улучшение принятого ответа Карла Мейера . Он работает с virtualenv для Python 3 и 2, а также для модуля venv в Python 3:
Проверка на
sys.real_prefix
обложки virtualenv, равенство непустыхsys.base_prefix
сsys.prefix
обложками venv.Рассмотрим скрипт, который использует такую функцию:
И следующий вызов:
источник
def is_venv(): return hasattr(sys, 'real_prefix') or sys.base_prefix != sys.prefix
. Просто говорю'.pipenv
созданными виртуальными средами.Проверьте
$VIRTUAL_ENV
переменную среды.$VIRTUAL_ENV
Переменная среды содержит каталог виртуальной среды, когда в активной виртуальной среде.После запуска
deactivate
/ выхода из виртуальной среды$VIRTUAL_ENV
переменная будет очищена / пуста. Python вызовет a,KeyError
потому что переменная окружения была не установлена.Те же самые проверки переменных среды, конечно же, можно выполнять и вне скрипта Python в оболочке.
источник
virtualenv
virtualenv, так и дляvenv
virtualenv.Согласно сообщению virtualenv на http://www.python.org/dev/peps/pep-0405/#specification вы можете просто использовать sys.prefix вместо os.environ ['VIRTUAL_ENV'].
sys.real_prefix не существует в моем virtualenv и не отличается от sys.base_prefix.
источник
sys.real_prefix
.env |grep VIRTUAL_ENV |wc -l
который вернет 1, если в venv, или 0, если нет.[[ -n $VIRTUAL_ENV ]] && echo virtualenv
или в[[ -z $VIRTUAL_ENV ]] && echo not virtualenv
зависимости от ваших потребностей.Чтобы проверить, есть ли у вас внутри Virtualenv:
Вы также можете получить больше данных о вашей среде:
источник
Здесь есть несколько хороших ответов, и некоторые менее надежные. Вот обзор.
Как не сделать это
Не полагайтесь на расположение 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, чтобы определить, установлена ли она.
Проблема заключается в том , что это работает только тогда , когда среда активируется с помощью
activate
сценария оболочки.Вы можете запустить сценарии среды не активируя ее , поэтому, если вас это беспокоит, вы должны использовать другой метод.
sys.base_prefix
virtualenv
,venv
Иpyvenv
точкаsys.prefix
в Python установлен внутри virtualenv , как можно было бы ожидать.В то же время первоначальная стоимость
sys.prefix
также доступна какsys.base_prefix
.Мы можем использовать это, чтобы определить, находимся ли мы в virtualenv.
Отступать:
sys.real_prefix
Теперь следите,
virtualenv
до 20 версии не устанавливалиsys.base_prefix
а установиласьsys.real_prefix
вместо этого.Так что, чтобы быть в безопасности, проверьте оба, как предложено в ответе hroncok :
анаконда
Если вы используете виртуальные среды Anaconda, проверьте ответ Виктории Стюарт .
источник
running_in_virtualenv = sys.*base_*prefix != sys.prefix
if hasattr(sys, 'real_prefix'):
тест, который больше не работал.Вы можете сделать
which python
и посмотреть, если он указывает на тот, в виртуальной среде.источник
which
по умолчанию недоступно в Windows. Вы можете использоватьwhere
вместо этого в Windows, или использовать whichcraft . Или посмотрите наsys.executable
. Но все же есть лучшие методы.Я обычно использую несколько установленных Anaconda виртуальных сред (venv). Этот фрагмент кода / примеры позволяет вам определить, находитесь ли вы в venv (или в вашей системной среде), а также для запроса конкретного сценария venv.
Добавить в скрипт Python (фрагмент кода):
Пример:
Обновление 1 - используйте в скриптах bash:
Вы также можете использовать этот подход в скриптах bash (например, тех, которые должны работать в определенной виртуальной среде). Пример (добавлен в скрипт bash):
Обновление 2 [ноябрь 2019]
Со времени моего первоначального поста я перешел от Anaconda venv (и сам Python эволюционировал viz-a-viz виртуальные среды ).
Пересматривая эту проблему, вот обновленный код Python, который вы можете вставить, чтобы проверить, что вы работаете в определенной виртуальной среде Python (venv).
Вот некоторый пояснительный код.
источник
Самый простой способ - просто запустить:
which python
если вы в virtualenv, он будет указывать на свой питон вместо глобальногоисточник
(отредактировано) Я нашел этот путь, что вы думаете об этом? (он также возвращает базовый путь venv и работает даже для readthedocs, где проверка переменной env не выполняется):
источник
Здесь уже опубликовано много отличных методов, но добавим еще один:
говорит вам, где
pip
установлены пакеты.источник
site.getsitepackages()
выводит каталог, который не является системным, вы можете сделать вывод, что находитесь в виртуальной среде.virtualenv
.venv
вы используете.Это не пуленепробиваемый, но для сред UNIX простой тест, такой как
отлично работает для меня Это проще, чем тестировать существующий некоторый атрибут, и, в любом случае, вы должны назвать свой каталог venv
venv
.источник
В ОС Windows вы видите что-то вроде этого:
Скобки означают, что вы на самом деле находитесь в виртуальной среде, называемой «virtualEnvName».
источник
Потенциал решение:
В моем случае я просто хотел определить, могу ли я устанавливать элементы с помощью pip как есть. Хотя это может быть не правильным решением для всех случаев, попробуйте просто проверить, есть ли у вас разрешения на запись для расположения исполняемого файла Python.
Примечание: это работает во всех версиях Python, но также возвращается,
True
если вы запускаете систему с Pythonsudo
. Вот потенциальный вариант использования:источник
Это старый вопрос, но приведенные выше примеры слишком сложны.
Сохраняйте это простым: (в ноутбуке Jupyter или терминале Python 3.7.1 в Windows 10)
источник
envs
в этом пути, это перестанет работать при переходе от анаконды кvirtualenv
илиpipenv
.