www.machinelearningmastery.ru

Машинное обучение, нейронные сети, искусственный интеллект
Header decor

Home

Руководство по виртуальным средам Python

Дата публикации May 23, 2019

Врата ада зависимости: «Оставь всякую надежду, входящие сюда».иллюстрацияпоГюстав Доре,

Виртуальные среды Python делают жизнь проще.МногоПолегче.

☄ В этом руководстве мы рассмотрим основы виртуальных сред и способы их использования. Затем мы заглянем внутрь и рассмотрим, как на самом деле работают виртуальные среды.

⚠️ Примечание: В этом руководстве мы будем использовать последнюю версию Python 3.7.x для MacOS Mojave.

Оглавление

Зачем использовать виртуальные среды?
Что за Virtualenv ?!
Использование виртуальных сред
Управление средами
Как виртуальные среды делают свое дело
Дальнейшее чтение


Зачем использовать виртуальные среды?

Виртуальные среды предоставляют простое решение длямножество потенциальных проблем, В частности, они помогают вам:

  • Решить проблемы зависимостипозволяя использовать разные версии пакета для разных проектов. Например, вы можете использовать пакет A v2.7 для проекта X и пакет A v1.3 для проекта Y.
  • Сделай свой проектавтономныйа такжевоспроизводимыйзахватывая все зависимости пакета в файле требований.
  • Установите пакеты на хосте, на котором у вас нет прав администратора.
  • Держите свой глобальныйsite-packages/убирайте каталог, удаляя необходимость устанавливать пакеты для всей системы, которые могут понадобиться только для одного проекта.

Звучит довольно удобно, нет? Когда вы начнете создавать более сложные проекты и сотрудничать с другими, вы увидите, каксущественныйвиртуальные среды есть. И если вы такой же ученый, как я, вы также захотите познакомиться с их многоязычными кузенами,Конда среды,

Но первым делом первым.


Что за Virtualenv ?!

Что именноявляетсявиртуальная среда?

Виртуальная среда - это инструмент Python дляуправление зависимостямиа такжепроектизоляция, Они позволяют Pythonпакеты сайта(сторонние библиотеки) для локальной установки в изолированномкаталог для конкретного проекта, а не для глобальной установки (т.е. как часть общесистемного Python).

Отлично. Все это звучит хорошо, но что такое виртуальная средадействительно? Ну, виртуальная среда простокаталогс тремя важными компонентами:

  • site-packages/папка, в которой установлены сторонние библиотеки.
  • Symlinksк исполняемым файлам Python, установленным в вашей системе.
  • Сценарииэто гарантирует, что исполняемый код Python использует интерпретатор Python и пакеты сайтов, установленные внутри данной виртуальной среды.

Последний бит, где все s *** понижается. Позже мы подробнее рассмотрим, а пока давайте просто посмотрим, как мы на самом деле используем виртуальные среды.


Вергилий успокаивает Цербер - Песнь VI.иллюстрацияГюстав Доре.

Использование виртуальных сред

Создание окружения

Скажем, мы хотели создать виртуальную среду для проекта, над которым мы работаем, под названиемtest-project/, который имеет следующее дерево каталогов.

test-project/
├── data
├── deliver # Final analysis, code, & presentations
├── develop # Notebooks for exploratory analysis
├── src # Scripts & local project modules
└── tests

Все, что нам нужно сделать, это выполнитьvenvмодуль, который является частью стандартной библиотеки Python.

% cd test-project/
% python3 -m venv venv/ # Creates an environment called venv/

⚠️ Примечание:Вы можете заменить «venv /» другим именем для вашей среды.

Вуаля! Виртуальная среда родилась. Теперь наш проект выглядит так:

test-project/
├── data
├── deliver
├── develop
├── src
├── tests
└── venv # There it is!

♻️ Напоминание:Виртуальная среда сама по себе является каталогом.

Осталось только «активировать» нашу среду, запустив скрипты, которые мы упоминали ранее.

% source venv/bin/activate             
(venv) % # Fancy new command prompt

Теперь мы находимся в активной виртуальной среде (на что указывает командная строка с префиксом имени активной среды).

На этом этапе мы будем работать над нашим проектом как обычно, будучи в безопасности, зная, что наш проект полностью изолирован от остальной части нашей системы. Внутри нашей среды мы не можем получить доступ к общесистемным пакетам сайтов, и любые устанавливаемые нами пакеты не будут доступны за пределами нашей среды.

Когда мы закончим работать над нашим проектом, мы можем выйти из среды с

(venv) % deactivate
% # Old familiar command prompt

Установка пакетов

По умолчанию толькоpipа такжеsetuptoolsустановлены внутри новой среды.

(venv) % pip list                    # Inside an active environmentPackage    Version
---------- -------
pip 19.1.1
setuptools 40.8.0

Если мы хотим установить определенную версию сторонней библиотеки, скажем v1.15.3 изnumpyмы можем просто использоватьpipкак обычно.

(venv) % pip install numpy==1.15.3
(venv) % pip listPackage Version
---------- -------
numpy 1.15.3
pip 19.1.1
setuptools 40.8.0

Теперь мы можем импортироватьnumpyв скрипте или активной оболочке Python. Например, скажем, наш проект содержит скриптtests/imports-test.pyсо следующими строками.

#!/usr/bin/env python3          

import numpy as np

Когда мы запускаем этот скрипт прямо из командной строки, мы получаем:

(venv) % tests/imports-test.py           
(venv) % # Look, Ma, no errors!

Успех. Наш скрипт импортированnumpyбез заминки 🥳.


Данте и Вергилий пересекают реку Стикс - Песнь VIII.иллюстрацияГюстав Доре.

Управление средами

Файлы требований

Самый простой способ сделать нашу работу воспроизводимой другими - это включить файл требований в наш проект.корневая директория(верхний каталог). Для этого мы запустимpip freeze, в котором перечислены установленные сторонние пакеты вместе с номерами их версий,

(venv) % pip freeze
numpy==1.15.3

И записать вывод в файл, который мы будем называтьrequirements.txt

(venv) % pip freeze > requirements.txt

Мы можем использовать эту же команду для перезаписи нашего файла требований всякий раз, когдамы обновляем пакет или устанавливаем новый.

Теперь любой, с кем мы делимся нашим проектом, сможет запустить наш проект в своей системе, дублируя нашу среду, используя нашуrequirements.txtфайл.


Дублирование Сред

Подождите - как именно мы это сделаем?

Представьте, что наш товарищ по команде Сара сняла нашtest-project/от нашей командыGitHubрепозиторий. В ее системе дерево каталогов проекта выглядит так:

test-project/
├── data
├── deliver
├── develop
├── requirements.txt
├── src
└── tests

Заметьте что-нибудь немного -необычный? Да, это верно. Нет никакихvenv/папки. Мы исключили его из репозитория нашей команды GitHub, потому что его включениеможет вызвать головную боль,

Это одна из причин наличияrequirements.txtфайлсущественныйдля воспроизведения кода вашего проекта.

Чтобы запустить нашtest-project/На своем компьютере Сара должна создать виртуальную среду внутри корневого каталога проекта.

Sara% cd test-project/
Sara% python3 -m venv venv/

И установить зависимости проекта в активной виртуальной среде с помощью заклинанияpip install -r requirements.txt,

Sara% source venv/bin/activate
(venv) Sara% pip install -r requirements.txtCollecting numpy==1.15.3 (from -r i (line 1))
Installing collected packages: numpy
Successfully installed numpy-1.15.3 # Woohoo! 🎊

Теперь среда проекта в системе Сарыв точкутак же, как в нашей системе. Довольно аккуратно, а?


Поиск проблемы

К сожалению, все не всегда идет по плану. В конце концов выволястолкнуться с проблемами. Возможно, вы по ошибке обновили определенный пакет сайта и теперь оказались на девятом уровнеЗависимость адане может запустить ни одной строки кода вашего проекта. Опять же, может быть, это не так уж и плохо. Может быть, вы найдете себя только вседьмой уровень,

На каком бы уровне вы ни находились, самый простой способ избежать пламени и увидеть солнце снова - этовоссоздаватьвиртуальная среда вашего проекта.

% rm -r venv/                           # Nukes the old environment
% python3 -m venv venv/ # Makes a blank new one
% pip install -r requirements.txt # Re-installs dependencies

Это оно. Благодаря вашемуrequirements.txtфайл, который вы вернулись в дело. Еще одна причинавсегдавключите файл требований в свои проекты.


Данте разговаривает с предателями на льду - Песнь XXXII.иллюстрацияГюстав Доре.

Как виртуальные среды делают свое дело

Итак, вы хотите узнать больше о виртуальных средах, а? Как то, как активная средазнаеткак использовать правильный интерпретатор Python и как найти нужные сторонние библиотеки.

echo $ PATH

Все сводится к стоимостиПУТЬ, который сообщает вашей оболочке, какой экземпляр Python использовать и где искать пакеты сайта. В вашей базовой оболочке PATH будет выглядеть примерно так.

% echo $PATH
/usr/local/bin:/usr/bin:/usr/sbin:/bin:/sbin

Когда вы вызываете интерпретатор Python или запускаете.pyсценарий, ваша оболочка ищет каталоги, перечисленные в PATHДля того, чтобыпока он не встретит экземпляр Python. Чтобы увидеть, какой экземпляр PATH найдет первым, запустите командуwhich python3,

% which python3
/usr/local/bin/python3 # Your output may differ

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

% python3                           # Activates a Python shell
>>> import site
>>> site.getsitepackages() # Points to site-packages folder['/usr/local/Cellar/python/3.7.3/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages']

Запуск сценарияvenv/bin/activateизменяет PATH, так что наша оболочка ищет локальные двоичные файлы нашего проектадопоиск в глобальных двоичных файлах нашей системы.

% cd ~/test-project/
% source venv/bin/activate
(venv) % echo $PATH~/test-project/venv/bin:/usr/local/bin:/usr/bin:/usr/sbin:/bin:/sbin

Теперь наша оболочка знает, как использовать локальный экземпляр Python нашего проекта

(venv) % which python3
~/test-project/venv/bin/python3

И где найти пакеты локального сайта нашего проекта.

(venv) % python3
>>> import site
>>> site.getsitepackages()['~/test-project/venv/lib/python3.7/site-packages'] # Ka-ching 🤑

Проверка вменяемости

Помните нашtests/imports-test.pyсценарий раньше? Это выглядело так.

#!/usr/bin/env python3          

import numpy as np

Мы смогли запустить этот сценарий из нашей активной среды без проблем, потому что экземпляр Python нашей среды смог получить доступ к пакетам локального сайта нашего проекта.

Что произойдет, если мы запустим тот же скрипт изза пределамивиртуальная среда нашего проекта?

% tests/imports-test.py                # Look, no active environmentTraceback (most recent call last):
File "tests/imports-test.py", line 3, in <module>
import numpy as npModuleNotFoundError: No module named 'numpy'

Да, мы получаем ошибку -как мы должны, Если бы мы этого не делали, это означало бы, что мы смогли получить доступ к пакетам локальных сайтов нашего проекта извне нашего проекта, что лишило нас цели использовать виртуальную среду. Тот факт, что мы получаем ошибку, является доказательством того, что наш проектполностьюизолированныеот остальной части нашей системы.


Дерево каталогов среды

Одна вещь, которая помогает мне хранить всю эту информацию в моей голове, - это иметь четкое представление о том, как выглядит дерево каталогов среды.

test-project/venv/               # Our environment's root directory
├── bin
│ ├── activate # Scripts to activate
│ ├── activate.csh # our project's
│ ├── activate.fish # virtual environment.
│ ├── easy_install
│ ├── easy_install-3.7
│ ├── pip
│ ├── pip3
│ ├── pip3.7
│ ├── python -> /usr/local/bin/python # Symlinks to system-wide
│ └── python3 -> python3.7 # Python instances.
├── include
├── lib
│ └── python3.7
│ └── site-packages # Stores local site packages
└── pyvenv.cfg

Данте и Вергилий возвращаются в царство смертных - Песнь XXXIV.иллюстрацияГюстав Доре.

Дальнейшее чтение

Если ваше любопытство не было удовлетворено, и вы все еще хотите узнать больше о виртуальных средах, я настоятельно рекомендую Real Python потрясающийучебник по виртуальным средам, И если вы окажетесь в плену замечательных иллюстраций Гюстава Доре, я настоятельно рекомендую прочитать книги Данте.ад,

Кроме этого, это делает это для нас. Если вы хотите быть в курсе моих научных публикаций о данных, не стесняйтесьПодпишись на меня в Твиттере,

Ура и счастливого чтения.

Оригинальная статья

Footer decor

© www.machinelearningmastery.ru | Ссылки на оригиналы и авторов сохранены. | map