Получите правильное представление о лучших практиках в рабочих процессах программирования Python.
«Первый принцип заключается в том, что вы не должны обманывать себя, и вас легче всего обмануть», — Ричард Фейнман.
Язык программирования Python с годами приобрел огромную популярность благодаря плавной кривой обучения, большому и активному сообществу пользователей, открытому исходному коду и зеленой экосистеме стандартных библиотек.
Может быть, это потому, что в Python есть несколько библиотек, которые не позволяют программистам изобретать велосипед, тем самым повышая свою производительность и эффективность.
Но мне пришло в голову, что знание тонкостей языка и незнание основ рабочего процесса проекта и настройки среды только ограничит вас как разработчика. Иногда это может даже внести хаос и беспорядок в рабочий процесс вашего проекта, особенно когда вам приходится использовать сторонние библиотеки, независимо от того, насколько элегантно и логично выглядел ваш код.
Я всегда слышал о термине «Виртуальная среда», но почти не знал, для чего он предназначен, почему он должен использоваться и когда он предназначен для использования. В этой статье вы узнаете, что такое виртуальные среды в Python, что они из себя представляют и как их инициировать для ваших проектов Python.
Почему важна виртуальная среда Python?
«Знать «почему» (идею) гораздо важнее, чем узнать «что» (факт)» — Джеймс Д. Уотсон.
Прежде чем мы перейдем к тому, почему виртуальные среды Python необходимы, важно понять, что такое стандартные библиотеки Python и как они используются.
Что такое стандартные библиотеки Python?
Стандартные библиотеки Python — это внешние наборы кодов Python, написанные с открытым исходным кодом, чтобы другие разработчики Python могли использовать их и экономить время, а не изобретать велосипед. Эти библиотеки представляют собой пакеты, от которых ваш проект зависит для выполнения конкретной задачи. Вот почему их также называют зависимости, и их часто можно найти в Python Package Index (PyPi). Например, студенту-математику предлагается написать программу, которая находит факториал числа. Есть много способов сделать это, если нет ограничений на задачу.
def factorial(a): """ Function that calculates the factorial of a number """ fact = 1 if a < 0: print("Sorry factorial does not exist for negative numbers") elif a == 0: print("The factorial of 0 is 1") else: for i in range(1, a+1): fact *= i return fact print(factorial(5)) # Output >>> 120
В приведенном выше коде студент просто пишет код из первого принципа для вычисления факториала числа. Альтернативный и более эффективный способ решить эту проблему и избежать повторного изобретения колеса — использовать математический модуль Python, в котором эта функциональность предварительно написана, как мы сделали бы в следующем блоке кода.
import math print(math.factorial(5)) # Output >>> 120
Как мы видим, мы получили одинаковый результат для двух подходов, но разница между подходами заключается в том, что тот, который использует стороннюю библиотеку, бойкотирует мельчайшие детали вычисления факториала числа и просто выбирает предопределенную функцию. (факториал) для этих функций из математической библиотеки и использует его в коде. Подход со стандартной библиотекой экономит время и более эффективен. Стандартные библиотеки почти неизбежны в любом проекте Python. Другими распространенными сторонними библиотеками являются библиотека запросов, используемая для просмотра веб-страниц, библиотека Pandas, используемая для манипулирования данными, и библиотека Numpy, используемая для числовых и матричных расчетов.
Итак, теперь, когда мы получили представление о том, что такое стандартные библиотеки Python, мы можем перейти к изучению того, почему виртуальные среды Python важны для рабочего процесса и структуры нашего проекта как разработчиков. Я бы привел базовую аналогию с шеф-поваром, который хочет приготовить два разных блюда, вероятно, «Джоллоф рис» и «Жареный рис». Хотя у этих двух блюд есть что-то общее (рис), они совершенно разные и требуют разных ингредиентов и подходов к их приготовлению.
Шеф-повару рационально готовить блюда в двух разных кастрюлях для получения надлежащего результата и избегать путаницы рецептов и блюд при приготовлении блюд, а также основа для приготовления блюд, которой является кастрюля, может различаться по размеру в зависимости от от количества продуктов, которые повар готов приготовить для двух разных блюд.
Но установка для приготовления останется одинаковой для двух блюд, поскольку шеф-повар, вероятно, будет использовать газовую плиту, кастрюлю, сервировочную ложку и тому подобное.
Единственная разница между ними будет заключаться в рецептах обоих блюд. Это также относится к виртуальным средам Python, поскольку оно используется для разделения или изоляции двух разных проектов Python, которые являются синонимами двух разных блюд, которые мы упомянули в нашем примере, рецепт блюд также аналогичен зависимостям Python, которые мы объяснили вначале.
Обычная среда разработки Python имеет глобальный интерпретатор Python и папку сторонних модулей, которые устанавливаются с помощью диспетчера пакетов Python с именем pip. Итак, как я объяснял ранее, сторонние модули — это наборы кодов, от которых зависит ваш проект для выполнения или выполнения конкретной задачи.
Я бы привел два важных примера того, почему виртуальная среда Python необходима при настройке наших проектов Python. Из изображения выше у нас есть представление о том, как настроена наша обычная среда Python. Первый проект в глобальном интерпретаторе python — это проект парсинга веб-страниц, который использует Python версии 2.7.9 и запрашивает библиотеку парсинга веб-страниц 1.1.0, а второй проект справа — это еще один проект парсинга веб-страниц, который также использует версию Python 3.8.9. и запрашивает версию 2.0.0.
Сторонний модуль, запросы, не поставляется предварительно установленным в библиотеках Python и постоянно обновляется с каждым новым выпуском с помощью диспетчера пакетов pip.
В нашем примере с изображения разработчик запускает проект веб-скрейпинга с запросами 1.1.0 со всеми своими кодами, написанными в соответствии с документацией запросов 1.1.0, затем через 2 месяца он решает провести еще один проект веб-скрейпинга в том же глобальный интерпретатор Python. На этот раз он обновляет свою библиотеку запросов до версии 2.0.0, что неплохо, но сейчас проблема заключается в том, что если бы он работал над первым проектом по очистке веб-страниц с обновленной библиотекой запросов, ему либо потребовалось бы изменить всю его кодовую базу проекта, чтобы сделать его совместимым с запросами 2.0.0.
Так как есть вероятность, что расхождения в документации запроса версии 1.1.0, которую он использовал для первого проекта, и версии 2.0.0 массовые или ему пришлось бы удалить библиотеку запросов версии 2.0.0 и переустановить версию 1.1.0, чтобы его исходный код работал без ошибок.
В другом случае у вас есть тот же проект парсинга веб-страниц, который построен на базе запросов версии 1.1.0. Но в этом случае проект с открытым исходным кодом и требует сотрудничества между несколькими разработчиками Python. Существует огромная вероятность того, что у нескольких разработчиков разные среды проекта и разные версии сторонних модулей (запросов), необходимых для проекта, в то время как кодовая база проекта работает на запросах версии 1.1.0, это, безусловно, порождает несоответствие между разработчиками, а также с кодовой базой проекта.
Все эти проблемы могут быть решены с помощью виртуальных сред Python, поскольку они позволяют пользователям хранить конкретные версии своих зависимостей в конкретном файле, обычно называемом requirements.txt, поэтому новый разработчик, желающий сотрудничать проект может легко получить доступ к версиям библиотек для проекта, установить их и быть в курсе требований и разработок проекта. Я покажу, как это сделать позже в статье.
Теперь, когда мы ясно понимаем, зачем нам нужны виртуальные среды Python в рабочем процессе нашего проекта Python, можно с уверенностью говорить о том, что на самом деле представляют собой виртуальные среды Python.
Что такое виртуальные среды?
Согласно официальной документации Python,
«Виртуальная среда — это такая среда Python, в которой интерпретатор Python, библиотеки и скрипты, установленные в ней, изолированы от установленных в других виртуальных средах и (по умолчанию) любых библиотек, установленных в «системном» Python, т. е. установлен как часть вашей операционной системы»
Виртуальные среды подобны контейнерам, которые позволяют разработчикам встраивать и отделять свои проекты Python от других проектов и в процессе предотвращать конфликты между разными версиями зависимостей и другими пакетами.
Пример, касающийся проектов парсинга веб-страниц, о которых мы говорили в разделе «Почему» статьи, может быть решен с использованием техники виртуальных сред, в основном путем инициирования виртуальной среды для двух разных проектов, как показано на изображениях ниже.
Второй случай также можно устранить, поместив проект в виртуальную среду и записав библиотеки, используемые для конкретного проекта, в файл с традиционным названием requirements.txt, чтобы разработчики могли легко получить доступ к этой информации и загрузите их перед совместной работой над проектом. После того, как это было сделано, настройка Совместная работа теперь выглядит так, как показано на изображении ниже, и можно включить бесшовное и гармоничное сотрудничество.
Как использовать виртуальные среды Python
В этом разделе статьи я расскажу, как установить и работать с виртуальными средами. Виртуальные среды Python всегда запускаются с помощью модуля с именем «"venv". Если у вас нет этого модуля в вашей глобальной среде, вы можете установить его с помощью следующей строки команды:
pip install venv
После установки библиотеки venv давайте проверим расположение нашего интерпретатора Python с помощью следующей команды.
which python
Итак, из вывода мы видим, что доступный нам интерпретатор Python находится в глобальной среде. Теперь давайте проверим доступные сторонние библиотеки в нашей глобальной среде с помощью следующей команды:
pip list
Из вывода видно, что в нашей глобальной среде установлено множество сторонних библиотек, начиная от Flask, beautifulsoup, Babel и им подобных. Теперь давайте создадим нашу виртуальную среду в каталоге нашего проекта с помощью следующей команды:
python -m venv <Environment Name>
наша виртуальная среда называется «Virtualenv», и, как мы видим на изображении, наша виртуальная среда была создана в каталоге проекта, следующее, что нужно сделать, это активировать виртуальную среду с помощью следующих команд для операционных систем Linux и Windows (ОС ) соответственно.
Для ОС Linux:
source <Environment Name>/bin/activate
Для ОС Windows:
source <Environment Name>/Scripts/activate
Мы можем заметить из терминала, что «(Virtualenv)» теперь появляется рядом с текстом нашего каталога, что просто означает, что виртуальная среда для проекта была активирована. Теперь, если мы проверим местоположение нашего интерпретатора Python с помощью команды which python
, мы заметим, что он изменился и теперь работает в виртуальной среде «Virtualenv», как мы видим ниже:
Давайте продолжим и проверим список сторонних библиотек, присутствующих в наших библиотеках на данный момент, и посмотрим на изменения.
Из вывода команды pip list
видно, что у нас всего несколько сторонних библиотек по сравнению с глобальной средой, которую мы проверяли изначально, поэтому теперь мы можем продолжить и установить библиотеку запросов, используя следующую команду:
pip install requests
Мы успешно установили библиотеку запросов в нашу виртуальную среду, мы можем убедиться в этом, проверив список сторонних библиотек, присутствующих в нашей виртуальной среде, с помощью команды pip list
.
Мы видим, что библиотека Requests уже присутствует в списке установленных библиотек в виртуальной среде. Затем давайте запишем информацию о наших сторонних библиотеках в файл с именем «requirements.txt», используя следующие команды:
pip freeze > requirements.txt
Из изображения видно, что пакеты, присутствующие в нашей виртуальной среде, были записаны в файл requirements.txt, поэтому в случае совместного проекта соавторы могут легко получить доступ к этому файлу и установить пакеты, используемые для проекта, используя следующие команда:
pip install -r requirements.txt
Наконец, мы можем деактивировать виртуальную среду и вернуться в нашу глобальную среду, используя следующую команду:
deactivate
Теперь мы вернулись в нашу глобальную среду и можем вернуться в нашу виртуальную среду, когда нам нужно, снова активировав виртуальную среду.
Заключение
В этой статье мы рассмотрели виртуальные среды: это контейнеры, используемые для изоляции проекта Python, который имеет множество зависимостей и обеспечивает правильную и эффективную структуру рабочего процесса разработки. Теперь мы знаем, почему виртуальные среды важны и как интегрировать их в наш рабочий процесс. Я надеюсь, что вы начнете создавать свою собственную виртуальную среду в своем сложном анализе данных, науке о данных, проектах по разработке программного обеспечения, а также проектах, требующих совместной работы.
Спасибо за чтение!