Чи можна визначити, чи працює поточний сценарій всередині virtualenv середовища?
Чи можна визначити, чи працює поточний сценарій всередині 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
змінної середовища не є надійним. Він встановлюється activate
сценарієм оболонки virtualenv , але virtualenv можна використовувати без активації, безпосередньо запустивши виконуваний файл з каталогу bin/
(або Scripts
) virtualenv , і в цьому випадку $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" {} \+
. Якщо це не вдається (я отримав "погані дані про маршалка"), вам потрібно буде витерти файли .pyc find /path/to/venv -type f -name "*.pyc" -exec rm {} \+
(не хвилюйтеся, вони відновляться автоматично).
...\lib\site-packages
у %PATH%
. Тож він поверне хибний позитив у такому випадку.
Це вдосконалення прийнятої відповіді Карла Мейєра . Він працює з 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
def is_venv(): return hasattr(sys, 'real_prefix') or sys.base_prefix != sys.prefix
. Просто говорю'.
pipenv
створеними віртуальними середовищами.
Перевірте $VIRTUAL_ENV
змінну середовища.
$VIRTUAL_ENV
Змінна середовища містить каталог віртуального середовища, коли в активній віртуальному середовищі.
>>> import os
>>> os.environ['VIRTUAL_ENV']
'/some/path/project/venv'
Після запуску deactivate
/ виходу з віртуального середовища $VIRTUAL_ENV
змінна буде очищена / порожня. Python підніме a, 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, в оболонці.
virtualenv
virtualenv, так і для venv
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.
sys.real_prefix
.
env |grep VIRTUAL_ENV |wc -l
який поверне значення 1, якщо в venv, або 0, якщо ні.
[[ -n $VIRTUAL_ENV ]] && echo virtualenv
або [[ -z $VIRTUAL_ENV ]] && echo not virtualenv
залежно від ваших потреб.
Щоб перевірити, чи є ваш всередині 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")}')
Тут є кілька хороших відповідей, і кілька менш надійних. Ось огляд
Не покладайтеся на розташування 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.base_prefix
virtualenv
, venv
і pyvenv
вкажіть sys.prefix
на встановлений всередині virtualenv Python так, як ви цього очікували.
У той же час початкове значення sys.prefix
також стає доступним як sys.base_prefix
.
Ми можемо використовувати це для виявлення, чи ми знаходимось у віртуальній програмі.
import sys
# note: Python versions before 3.3 don't have sys.base_prefix
# if you're not in virtual environment
running_in_virtualenv = sys.prefix != sys.base_prefix
sys.real_prefix
Тепер дивіться, virtualenv
раніше версія 20 не встановлювалась, sys.base_prefix
а була встановлена sys.real_prefix
натомість.
Щоб бути безпечним, перевірте обидва, як було запропоновано в відповіді hroncok :
import sys
real_prefix = getattr(sys, "real_prefix", None)
base_prefix = getattr(sys, "base_prefix", sys.prefix)
running_in_virtualenv = (base_prefix or real_prefix) != sys.prefix
Якщо ви використовуєте віртуальне середовище Anaconda, перевірте відповідь Вікторії Стюарт .
running_in_virtualenv = sys.*base_*prefix != sys.prefix
if hasattr(sys, 'real_prefix'):
тест, який більше не працював.
Ви можете зробити which python
і подивитися, чи вказує його на віртуальне оточення.
Я звичайно використовую кілька встановлених анакондами віртуальних середовищ (venv). Цей фрагмент коду / приклади дає змогу визначити, чи знаходитесь ви в venv (або у вашому системному середовищі), а також вимагати конкретного venv для вашого сценарію.
Додати до сценарію Python (фрагмент коду):
# ----------------------------------------------------------------------------
# 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! ... ]
Приклад:
$ p2
[Anaconda Python 2.7 venv (source activate py27)]
(py27) $ python webcam_.py
Please set the py35 { p3 | Python 3.5 } environment!
(py27) $ p3
[Anaconda Python 3.5 venv (source activate py35)]
(py35) $ python webcam.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) $
Оновлення 1 - використання в bash-скриптах:
Ви також можете використовувати такий підхід у bash-скриптах (наприклад, тих, які повинні працювати у певному віртуальному середовищі). Приклад (доданий до bash script):
if [ $CONDA_DEFAULT_ENV ] ## << note the spaces (important in BASH)!
then
printf 'venv: operating in tf-env, proceed ...'
else
printf 'Note: must run this script in tf-env venv'
exit
fi
Оновлення 2 [листопада 2019]
З моєї первісної публікації я перейшов від Anaconda venv (і сам Python розвивався віз-а-віз візуально візуально віртуальними середовищами).
Переглянувши цю проблему, ось оновлений код Python, який ви можете вставити, щоб перевірити, що ви працюєте у певному віртуальному середовищі Python (venv).
import os, re
try:
if re.search('py37', os.environ['VIRTUAL_ENV']):
pass
except KeyError:
print("\n\tPlease set the Python3 venv [alias: p3]!\n")
exit()
Ось пояснювальний код.
[victoria@victoria ~]$ date; python --version
Thu 14 Nov 2019 11:27:02 AM PST
Python 3.8.0
[victoria@victoria ~]$ python
Python 3.8.0 (default, Oct 23 2019, 18:51:26)
[GCC 9.2.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import os, re
>>> re.search('py37', os.environ['VIRTUAL_ENV'])
<re.Match object; span=(20, 24), match='py37'>
>>> try:
... if re.search('py37', os.environ['VIRTUAL_ENV']):
... print('\n\tOperating in Python3 venv, please proceed! :-)')
... except KeyError:
... print("\n\tPlease set the Python3 venv [alias: p3]!\n")
...
Please set the Python3 venv [alias: p3]!
>>> [Ctrl-d]
now exiting EditableBufferInteractiveConsole...
[victoria@victoria ~]$ p3
[Python 3.7 venv (source activate py37)]
(py37) [victoria@victoria ~]$ python --version
Python 3.8.0
(py37) [victoria@victoria ~]$ env | grep -i virtual
VIRTUAL_ENV=/home/victoria/venv/py37
(py37) [victoria@victoria ~]$ python
Python 3.8.0 (default, Oct 23 2019, 18:51:26)
[GCC 9.2.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import os, re
>>> try:
... if re.search('py37', os.environ['VIRTUAL_ENV']):
... print('\n\tOperating in Python3 venv, please proceed! :-)')
... except KeyError:
... print("\n\tPlease set the Python3 venv [alias: p3]!\n")
...
Operating in Python3 venv, please proceed! :-)
>>>
Найпростіший спосіб - просто запустити: which python
якщо ви знаходитесь у virtualenv, він вкаже на його python замість глобального
(відредаговано) Я знайшов саме так, що ви думаєте про це? (він також повертає базовий шлях 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'] + '/../')
Тут вже розміщено безліч чудових методів, але просто додайте ще один:
import site
site.getsitepackages()
повідомляє, де pip
встановлені пакети.
site.getsitepackages()
виводить каталог, який не є системним, ви можете встановити, що ви знаходитесь у віртуальному середовищі.
virtualenv
.
venv
ви використовуєте.
У ОС Windows ви бачите щось подібне:
C:\Users\yourusername\virtualEnvName\Scripts>activate
(virtualEnvName) C:\Users\yourusername\virtualEnvName\Scripts>
Парези означають, що ви насправді перебуваєте у віртуальному середовищі під назвою "virtualEnvName".
Потенціал рішення:
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'])
Це старе питання, але занадто багато прикладів вище є надто складними.
Нехай це буде просто: (у ноутбуці 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'
envs
на цьому шляху, це перестане працювати, коли ви переходите з анаконди до virtualenv
або pipenv
.