Виртуальные среды для абсолютных новичков - что это такое и как создать (+ примеры)
Если вы работаете над множеством разных проектов, вы узнаете ад зависимости множества проектов, требующих нескольких версий, нескольких пакетов. Вы не можете просто установить все пакеты глобально, как вы отслеживаете? Также что происходит, когда projectA требуется PackageX_version1, а ProjectB - PackageX_version2? Как оставаться в здравом уме, когда все представляет собой один большой беспорядок взаимозависимости, похожий на спагетти?
В этой статье я попытаюсь убедить, что использование venv (виртуальной среды) - это способ отделить зависимости от других проектов. Мы начнем с определения, что такое venv, для чего он нужен и зачем он вам нужен. Затем мы создадим его и увидим все его преимущества. В конце у нас будет несколько основных правил, позволяющих сохранять зависимости в наших проектах как можно более чистыми.
1. Что такое venv и зачем он мне нужен?
Что произойдет, если одному из ваших проектов понадобится пакет с версией, отличной от версии другого проекта? Что происходит, когда вы обновляете пакет для одного проекта: испортит ли это ваш код в другом проекте, который зависит от этого пакета? Как вы делитесь своим кодом с другими?
Чтобы получить представление о том, что такое venv, мы разделим его на две части: виртуальную и окружающую среду
Окружающая среда
Среда, с которой вы уже знакомы. Например, когда вы устанавливаете Python3.10, вы не просто устанавливаете движок Python, также устанавливается pip. Когда вы используете pip для установки пакета, он попадает в папку Scripts в каталоге, в который вы установили Python. Это ваша среда: Python 3.10 со всеми установленными пакетами.
Если вы запустите свою программу python main.py
произойдет следующее:
- ваша система ищет, где у вас установлен python, через системную переменную PATH, поэтому она переводит вашу команду во что-то вроде
C:\Program Files\Python39\python.exe main.py
. - Затем ваш скрипт main.py передается движку Python. Если вы, например,
import requests
где-то в своем скрипте, он будет искать этот пакет в каталоге, в котором установлен python, в папкеLib
(в моем случаеC:\Program Files\Python39\Lib
). - Если у вас установлен пакет, python может найти его в этой папке и импортировать код, чтобы вы могли его использовать, иначе он вернет ошибку, сообщающую, что пакет, который вы пытаетесь импортировать, не установлен.
Эта глобальная установка Python - ваша единственная среда, если вы не используете виртуальные среды. Вы можете видеть, что хранение всех зависимостей ваших проектов в одной большой коробке может быть опасным. Пора разделить это на виртуальные среды.
Виртуальная среда
Мне нравится думать о Venv как о создании совершенно новой, несколько более легкой среды специально для этого проекта. В следующих частях мы увидим, что когда вы создаете venv для своего проекта, вы фактически устанавливаете Python, pip и папку dependencies заново для этого конкретного проекта. Этот код не находится в вашем пути Python по умолчанию (например C:\Program Files\Python39
), но может быть установлен где угодно, например, в папке вашего проекта (например C:\myProject\weatherApp\venv
).
Совместное использование и создание окружающей среды
Когда у вас есть виртуальная среда, вы можете указать ей создать для вас список всех содержащихся в ней пакетов. Затем, когда кто-то еще захочет использовать ваш код, он может создать собственный venv и использовать этот список для одновременной установки всех пакетов с нужными версиями. Это позволяет очень легко поделиться своим кодом с другими (через git, почту или USB-накопитель).
2. Создание виртуальной среды
Создадим нашу виртуальную среду! В следующих шагах мы убедимся, что виртуальная среда может быть создана. Мы будем использовать пакет Python под названием virtualenv для создания наших файлов venv
2.1 Установите Python
- Проверьте архитектуру вашей системы; это либо 32, либо 64 бита.
- Загрузите и установите Python с веб-сайта Python. Убедитесь, что он соответствует вашей системе (32 или 64 бит).
- Python установлен правильно, если вы видите версию, которую вы установили, после выполнения
python --version
в терминале.
2.2 Установите virtualenv
Virtualenv - это пакет Python, который позволяет нам создавать файлы venv. Мы установим его глобально на нашу машину.
- Установите пакет virtualenv с помощью pip: мы просто устанавливаем его, вызывая
pip install virtualenv
- Virtualenv установлен правильно, если вы можете выполнить
python -m virtualenv -h
.
Эта команда указывает python загрузить один из его (-m) модулей, то есть модуль virtualenv. Флаг -h просит virtualenv показать параметры «справки». Он показывает вам несколько советов, тогда вы знаете, что он установлен правильно.
2.3 Создание нашей первой виртуальной среды
Теперь, когда у нас есть программное обеспечение для создания виртуальных сред, мы можем его создать.
- Перейдите в папку, в которой вы хотите создать свой проект. Назовем это корневой папкой. В моем случае это так
cd c:/applications/newpythonproject
. - Скажите Python использовать venv для создания новой виртуальной среды
python -m venv c:/applications/newpythonproject/venv
`
Это создаст новый каталог в вашей корневой папке с именем venv, содержащий новую версию python и pip. Здесь мы установим наши пакеты.
3. Использование нашей виртуальной среды
Давайте начнем использовать нашу виртуальную среду. В этой части мы активируем его, установим несколько пакетов и снова деактивируем
3.1 Активация нашей виртуальной среды
Когда мы запустим pip install requests
сейчас, он все равно установит их глобально, а это не то, что нам нужно. Чтобы установить пакеты внутри нашего venv, мы должны активировать наш venv, чтобы установить их там. В вашей корневой папке мы выполняем следующую команду: venv\scripts\activate
. (обратите внимание, что косые черты - это \, другие (/) не будут работать.
Если ваша среда активирована, вы увидите (venv) перед своим путем в вашем терминале, как на изображении выше. Каждый пакет, который вы pip install
будет установлен в вашем virtualenv.
3.2 Использование нашей виртуальной среды
Вызов например pip install requests
сейчас установит его на ваш venv. Вы можете увидеть это, вызвав pip list
в вашей активированной среде; вы увидите там запросы. С другой стороны, если вы вызовете pip list
в другом терминале (где не активирован venv), вы увидите другой список установленных пакетов
3.3 Деактивация нашей виртуальной среды
Вы можете отключить Venv, просто выполнив deactivate
в своем терминале.
4. Экспорт и сборка venv
Вы создали приложение, которое работает с некоторыми зависимостями. Предположим, вы установили запросы и панды для запроса данных из API, выполнили некоторую очистку в пандах и затем сохранили их в файл. Теперь вы хотите, чтобы другие использовали вашу программу, но вот проблема: им нужно установить точно такие же зависимости с правильными версиями и все такое. Дадим им список.
4.1. Перечислите свои зависимости в файле requirements.txt
Представим что у вас есть список пакетов, от которых зависит ваша программа. Pip может прочитать этот список и установить все пакеты.
Это именно то, что делает файл requirements.txt. Он замораживает содержимое текстового файла pip list
с помощью следующей команды pip freeze > requirements.txt
. Единственное, что следует отметить, это то, что приведенная выше команда создает файл requirements.txt в папке, в которой вы сейчас находитесь, например, в вашей корневой папке. Вы также можете заморозить файл в другом месте или с другим именем, pip freeze > c:/some/other/path/mylist.txt
но это не рекомендуется.
4.2 Загрузка ваших зависимостей
Если у вас есть файл requirements.txt, вы можете просто вызвать pip install -r requirements.txt
для установки всех перечисленных пакетов. Флаг -r означает чтение, поэтому pip устанавливает все пакеты, которые он читает, в указанный вами файл.
Еще раз обратите внимание, что он ищет файл requirements.txt в папке, в которой вы сейчас находитесь. Вы также можете загрузить его из другого места, например pip install -r c:/some/other/location/requirements.txt
.
4.3 Игнорирование виртуальных сред в git
Если вы хотите добавить свой проект в систему контроля версий, такую как Github, не рекомендуется включать всю виртуальную среду. Это занимает много места и времени для загрузки и скачивания.
Рекомендуется указать git игнорировать вашу папку, содержащую вашу виртуальную среду. Для этого вы можете просто создать в своей корневой папке файл с именем .gitignore
(обратите внимание, что gitignore - это расширение, у этого файла нет имени) и дать ему следующий контент venv/
. Это говорит git игнорировать вашу папку venv. Если папка, в которой вы сохранили Venv, называется как-то иначе, вы, очевидно, должны записать здесь правильное имя папки.
4.4 Установка пакетов из проектов git с исключенным venv
Что происходит, когда Bob извлекает ваш код из Github и хочет использовать вашу программу? Если вы были умны, вы заморозили свои пакеты до файла requirements.txt. Боб может просто pip install -r requirements.txt
и начать пользоваться вашей программой!
4.5 Виртуальные среды, requirements.txt и docker
Docker нужен список инструкций для сборки контейнера, и файл requirements.txt идеально подходит для этого. Dockerfile может выглядеть так:
FROM python:3.9-slim-buster
# 1. Copy application code to a folder in container
COPY . /usr/src/downloadService
# 2. Cd to the folder
WORKDIR /usr/src/downloadService
# 3. Tell pip to install all required packages
RUN pip install -r requirements.txt
# 4. Execute app
EXPOSE 5000
WORKDIR /usr/src/downloadService/src
CMD ["python", "-i", "app.py"]
Не волнуйтесь, если у вас нет опыта работы с Docker, просто знайте, что мы можем автоматически перенести весь наш исходный код внутри контейнера, установить все пакеты (# 3), а затем запустить наше приложение.
5. Лучшие практики: предотвращение ада зависимости
Ад зависимостей - это когда все наши проекты связаны своими зависимостями. Это достаточно сложно, чтобы не работать в одиночку, но особенно когда вы работаете в команде. В этой части делается попытка установить некоторые основные правила работы с проектом Python.
- Каждый проект python получает собственную виртуальную среду
- Заморозить зависимость, черт возьми
pip freeze
! Обновляйте файл requirements.txt при каждой установке или удалении - Включите файл с именем
pythonversion.txt
в вашем корне, в котором записана ваша версия python (python --version
). - Не всегда требуется: создайте приложение в контейнере Docker, чтобы вы также могли отслеживать ОС.
Следуя этим правилам, не должно быть вопросов о типе и версии ОС, python и всех его зависимостях.
Заключение
Я надеюсь, что смогу прояснить виртуальные среды и то, как Python устанавливает зависимости и как сохранить зависимости, чтобы они запутывались между проектами. Если у вас есть предложения / пояснения, прокомментируйте, чтобы я мог улучшить эту статью. Удачного кодирования!