Virtualenv linux что это

Виртуальные окружения в Python

Python знаменит своей обширной стандартной библиотекой и девизом «батарейки в комплекте» (batteries included). Даже из коробки Python позволяет удобно и быстро решить огромный пласт задач, например, например, работа с файлами, запуск простого веб-сервера, работа с электронной почтой, парсинг XML и JSON, и так далее. Во всяком случае, это намного удобнее, чем писать shell-скрипты 😅

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

Установка сторонней библиотеки

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

и понеслась! Множество библиотек в своих инструкциях по установке именно так и предлагают их устанавливать. Это и правда работает, это и правда так просто, но есть нюансы. В этом месте закопаны очень популярные грабли, по которым прошлось множество начинающих питонистов, в том числе и я.

Как pip устанавливает пакеты

Давайте разберемся, что же происходит, когда юзер набирает в терминал такую команду. В общих чертах происходит следующее.

  1. pip обращается в PyPI (Python Package Index) и находит там запрашиваемый пакет.
  2. Пакет скачивается. Обычно это просто zip-архив, который содержит код библиотеки, разложенный внутри согласно формату. Современным и рекомендуемым форматом пакетов является wheel (PEP-427), но в дикой природе встречаются и другие форматы.
  3. pip устанавливает пакет.
  4. Библиотека установлена, ее можно импортировать и использовать.

Давайте подробнее разберем третий шаг. Установка пакета — звучит загадочно и сложно, но на самом деле ничего сложного здесь не происходит. pip просто распаковывает zip-архив в определенное место (это справедливо для формата wheel, для установки пакетов в других форматах могут потребоваться дополнительные действия, но давайте разберем самый распространённый и простой случай). Куда именно происходит установка? Это можно узнать, выполнив следующую команду:

В списке sys.path можно увидеть директорию site-packages — именно туда и будет установлена библиотека. Давайте в этом убедимся.

До установки пакета:

После установки пакета:

Как видим, в директорию site-packages добавилась библиотека requests вместе со всеми своими зависимостями.

Важные мысли, которые я пытаюсь донести:

  1. установка библиотеки напрямую влияет на файловую систему;
  2. у интерпретатора Python есть только одна директория site-packages , куда pip и устанавливает пакеты.

А это значит, что в один интерпретатор Python нельзя установить две версии одной библиотеки одновременно. При установке новой версии предыдущая «перезатирается». Просто как если бы вы распаковали другой архив с совпадающими именами файлов в то же самое место.

Боль — это жизненный опыт

Что же будет, если вам понадобится работать над двумя проектами, которые будут требовать разных, не совместимых между собой версий одной и той же библиотеки? Возможно, между этими версиями в библиотеку были внесены какие-то крупные ломающие изменения, например, переименовались методы/функции или изменился набор аргументов.

Например, проект А:

Вы просто не сможете работать над такими проектами одновременно. Установка зависимостей одного проекта сломает другой, и наоборот. При переключении между проектами придётся каждый раз устанавливать зависимости нужного проекта, что довольно легко забыть сделать.

Читайте также:  Windows ide hard drive cache package

Ситуация кажется маловероятной, но я гарантирую, что рано или поздно это случится, если устанавливать зависимости всех своих проектов в один интерпретатор. Всё усугубляется тем фактом, что прямые зависимости вашего проекта тянут за собой свои зависимости (под-зависимости), те, в свою очередь, тоже могут от чего-то зависеть (под-под-зависимости). В итоге вы получаете целое дерево зависимостей. И если где-то в этом дереве окажется библиотека не той версии, что ожидалось, то весь проект может начать очень странно работать. Вы получите такие эзотерические ошибки, которых еще никто в интернете до вас не встречал. Если всё сразу сломалось, то считайте, что легко отделались — по крайней мере, так довольно просто понять, в чём проблема. Но бывают и ситуации намного хуже, когда приложение просто начинает немножко иначе работать, без каких-либо ошибок, и возможно придется потратить долгие часы на траблшутинг, чтобы найти настоящую причину.

Надеюсь, я убедил вас, что устанавливать зависимости нескольких проектов в один интерпретатор — это очень-очень плохо. Но как же тогда правильно?

Виртуальные окружения

Решение очевидно — у каждого проекта должен быть свой интерпретатор Python, со своей собственной изолированной директорией site-packages . Это и есть основная идея, стоящая за виртуальными окружениями. Виртуальное окружение — это самостоятельная копия интерпретатора со своими пакетами.

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

Начиная с Python версии 3.5 (на данный момент это самая старая из официально поддерживаемых версий языка, так что справедливо ожидать, что как минимум везде установлен Python 3.5 или новее), создать виртуальное окружение стало очень просто:

Например, допустим, что мы работаем над проектом blog_source :

Создавать виртуальное окружения рядом с кодом — это распространённая практика, так проще ничего не перепутать, но вообще виртуальное окружение может быть где угодно, и директория тоже может называться как угодно. Обратите внимание, что если вы создаете виртуальное окружение в директории под управлением системы контроля версий (git), то его не нужно коммитить. Лучше вообще добавьте его ( env/ ) в .gitignore .

В директорию env будет скопирован тот самый интерпретатор, при помощи которого виртуальное окружение и создавалось. Т.е. если

то в виртуальном окружении будет та же самая версия:

Активируем окружение

Посмотрим, что внутри директории env :

Обратите внимание, что в директории bin есть некий файл activate в нескольких вариантах для разных шеллов. Это и есть «точка входа» в виртуальное окружение. Просто создать виртуальное окружение мало, нужно его активировать. Но сначала проверим, какие python и pip (исполняемые файлы) используются в обычном режиме работы:

Это мой обычный Python, вне виртуального окружения, назовём его глобальным. Теперь активируем виртуальное окружение:

Для Windows процесс активации будет отличаться (допустим, что виртуальное окружение создано в C:\src\blog_source ):

Обратите внимание, что приветствие шелла изменилось (добавилось (env) ), чтобы показать, что мы «внутри» виртуального окружения под названием env .

Теперь проверим еще раз, какие python и pip используются:

Посмотрите на пути — мы внутри виртуального окружения! Теперь можно смело устанавливать любые пакеты, и это никак не повлияет на глобальный Python или на другие виртуальные окружения:

Можно запускать любые файлы, и они будут иметь доступ к установленным пакетам:

IDE тоже нужно настроить, указав путь к bin/python внутри виртуального окружения, тогда редактор сможет лучше вам помогать.

По завершению работы с виртуальным окружением можно просто набрать deactivate , либо закрыть окно терминала:

Читайте также:  Решение квадратных уравнений windows forms

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

Виртуальное окружение можно полностью удалить, когда оно перестанет быть нужным:

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

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

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

Ничего не устанавливайте в глобальный интерпретатор

Иногда возникает желание установить какой-нибудь пакет прямо в глобальный интерпретатор, потому что по смыслу этот пакет вроде как должен быть вне виртуальных окружений. Например, это может быть какая-нибудь программа, типа poetry , docker-compose , youtube-dl или howdoi . Руки набирают в терминал:

Установка начинается, прогресс-бары заполняются, но в итоге всё завершается чем-то типа такого:

Можно попробовать установить, используя sudo , и это сработает, но это считается очень плохой практикой, и я настоятельно рекомендую так не делать по нескольким причинам:

В секции про установку пакетов я упомянул, что для пакетов других форматов, кроме wheel, могут потребоваться дополнительные действия. На самом деле, при установке пакета формата sdist исполняется файл setup.py , в котором потенциально могут содержаться любые действия — от честной установки пакета, до rm -rf / или установки криптомайнера в систему. Т.к. в PyPI пакет загрузить может кто угодно, никогда нельзя быть уверенным, что именно сделает пакет при установке. Выполнять такой скрипт с системными привилегиями ( sudo ) — не самый мудрый ход.

Может нарушить целостность системы.

Часто в операционных системах принято устанавливать программы через пакетный менеджер (будь то apt , dnf или pacman ). Этот же пакетный менеджер затем может без следа удалить установленную программу, потому что он ведёт учёт файлов — какой программе какие файлы принадлежит. Если начать изменять файлы программ каким-либо образом, помимо пакетного менеджера, то это может нарушить его работу. pip , конечно, установит что нужно, но после этого могут возникнуть проблемы с системным пакетным менеджером.

сказать pip , чтобы он установил пакет не в директорию site-packages , а в домашнюю директорию пользователя при помощи флага —user :

Обязательно нужно убедиться, что директория, куда установится пакет, перечислена в переменной $PATH . Путь к директории можно получить при помощи следующей команды:

К получившемуся пути нужно в конце добавить /bin для Linux и MacOS, либо \Scripts для Windows, так что в моём случае (MacOS) в $PATH нужно добавить вот такой путь: /Users/and-semakin/.local/bin .

Подробнее про этот метод установки читайте здесь.

установить программу через пакетный менеджер ОС, например:

Часто мейнтейнеры ОС создают обёртки для пакетов из PyPI, которые можно установить при помощи системного пакетного менеджера. Как правило, такие обёртки называются python- или python3- . Это делается как раз для того, чтобы дать пользователям возможность устанавливать Python-программы, не нарушая работу пакетного менеджера ОС. Кроме того, эти пакеты проходят проверку безопасности, так что риск получить криптомайнер значительно ниже.

Читайте также:  Менеджеров задач для mac os

Выводы

  • всегда устанавливайте зависимости проектов в отдельные виртуальные окружения;
  • если нужно установить пакет «глобально», то используйте либо pip install —user . , либо прибегните к помощи пакетного менеджера операционной системы;
  • никогда не используйте sudo pip . — считайте, что это табу.

Да, виртуальные окружения — определенно не самая удобная часть разработки на Python, и уж точно не самая простая тема, к этому просто нужно привыкнуть. Несколько раз повторил, выработал привычку — в целом, ничего сложного. Кроме того, экосистема Python развивается очень быстро, и я надеюсь, что скоро правильная установка пакетов и управление виртуальными окружениями станут намного легче. Уже сейчас можно пользоваться такими инструментами, которые в некоторой мере прячут от пользователя виртуальные окружения:

Стабильных вам зависимостей и кода без багов!

Источник

Virtualenv: руководство по виртуальному окружению Python

Примечание: В этом руководстве используется менеджер пакетов pip, если он у вас не установлен, то сначала установите его.

Virtualenv — это инструмент для разделения зависимостей, необходимых для проектов. При работе над несколькими проектами часто возникает проблема, что разным проектам нужны разные версии одних и тех же пакетов, virtualenv помогает нам решать подобные проблемы. Это также решает проблему засорения системы ненужными пакетами, так как виртуальные окружения можно легко создавать и удалять.

Установка virtualenv

Virtualenv — это просто пакет, доступный в pypi, вы можете использовать pip для его установки.

После установки вам может потребоваться добавить C:\Python34\Scripts в переменную среды PATH. Таким образом, такие команды, как pip и virtualenv можно будет выполнять из любой директории.

Создание виртуального окружения

Создайте новую директорию с именем python_project и измените текущую рабочую директорию на python_project:

Чтобы создать виртуальное окружение внутри python_project, вам нужно выполнить следующую команду:

Это создаст новую директорию my_env внутри python_project. Эта директория будет содержать копию интерпретатора python и копию исполняемого файла pip. Здесь мы использовали my_env в качестве имени, но вы можете использовать любое другое имя. Теперь ваше виртуальное окружение готово к использованию, вам просто нужно его активировать.

В этом руководстве есть один момент: мы установили virtualenv используя python 3.4. Предположим, у вас также есть python 2.7 и вы хотите создать виртуальное окружение, используя python 2.7 вместо python 3.4, вы можете сделать это с помощью следующей команды:

Активация виртуального окружения

Для Windows выполните следующую команду:

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

Обратите внимание на (my_env) , это означает, что вы сейчас работаете в виртуальном окружении.

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

Давайте попробуем установить пакет requests.

В Windows введите следующее:

Вы не можете ввести просто pip install requests в windows, потому что будет вызываться глобальный pip, если вы добавили C:\Python34\Scripts в переменную среды PATH. Если вы не добавили, то вы получите ошибку.

В Linux вам нужно ввести следующее:

Деактивация виртуального окружения

Для деактивации виртуального окружения используйте следующую команду:

Эта команда вернет вас обратно в системный интерпретатор python по умолчанию, где вы можете установить пакет в общесистемное окружение.

Теперь вы должны видеть преимущества использования virtualenv. Это помогает нам изолировать зависимости (пакеты) проектов избегая конфликтов.

Источник

Оцените статью