Чи можна визначити, чи працює поточний сценарій всередині 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, в оболонці.
virtualenvvirtualenv, так і для venvvirtualenv.
Відповідно до 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.executablesys.prefixpip -Vwhich 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_prefixvirtualenv, 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.