Получите правильное представление о лучших практиках в рабочих процессах программирования 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, который имеет множество зависимостей и обеспечивает правильную и эффективную структуру рабочего процесса разработки. Теперь мы знаем, почему виртуальные среды важны и как интегрировать их в наш рабочий процесс. Я надеюсь, что вы начнете создавать свою собственную виртуальную среду в своем сложном анализе данных, науке о данных, проектах по разработке программного обеспечения, а также проектах, требующих совместной работы.

Спасибо за чтение!