Как установить виртуальное окружение в python windows

Язык программирования Python считается достаточно простым. На нем легче и быстрее пишутся программы, по сравнению с компилируемыми языками программирования. Для...

Время прочтения
8 мин

Просмотры 220K

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

Довольно часто я вижу, как мои знакомые и друзья начинают изучать Python и сталкиваются с проблемой установки и использования сторонних библиотек. Они могут несколько часов потратить на установку библиотеки, и даже, могут не справиться с этим и забить на неё. В то время как, в большинстве случаев, это можно было сделать за несколько минут.

Статья начинается с базовых вещей: с установки Python 3, инструментов разработки Pip и Virtualenv и среды разработки PyCharm в Windows и в Ubuntu. Для многих это не представляет трудностей и возможно, что уже всё установлено.

После чего будет то, ради чего задумывалась статья, я покажу как в PyCharm создавать и использовать виртуальные окружения и устанавливать в них библиотеки с помощью Pip.

Установка Python и Pip

Pip является менеджером пакетов для Python. Именно с помощью него обычно устанавливаются модули/библиотеки для разработки в виде пакетов. В Windows Pip можно установить через стандартный установщик Python. В Ubuntu Pip ставится отдельно.

Установка Python и Pip в Windows

Для windows заходим на официальную страницу загрузки, где затем переходим на страницу загрузки определенной версии Python. У меня используется Python 3.6.8, из-за того, что LLVM 9 требует установленного Python 3.6.

Далее в таблице с файлами выбираем «Windows x86-64 executable installer» для 64-битной системы или «Windows x86 executable installer» для 32-битной. И запускаем скачанный установщик, например, для версии Python 3.8.1 он называется python-3.8.1-amd64.exe.

Во время установки ставим галочку возле Add Python 3.x to PATH и нажимаем Install Now:

Установка Python 3 в Windows 10

Установка Python и Pip в Ubuntu

В Ubuntu установить Python 3 можно через терминал. Запускаем его и вводим команду установки. Вторая команда выводит версию Python.

sudo apt install python3-minimal
python3 -V

Далее устанавливаем Pip и обновляем его. После обновления необходимо перезапустить текущую сессию (или перезагрузить компьютер), иначе возникнет ошибка во время вызова Pip.

sudo apt install python3-pip
pip3 install --user --upgrade pip

Основные команды Pip

Рассмотрим основные команды при работе с Pip в командой строке Windows и в терминале Ubuntu.

Если виртуальные окружения не используются, то во время установки пакета(ов) полезно использовать дополнительно ключ --user, устанавливая пакет(ы) локально только для текущего пользователя.

Установка VirtualEnv и VirtualEnvWrapper

VirtualEnv используется для создания виртуальных окружений для Python программ. Это необходимо для избежания конфликтов, позволяя установить одну версию библиотеки для одной программы, и другу для второй. Всё удобство использования VirtualEnv постигается на практике.

Установка VirtualEnv и VirtualEnvWrapper в Windows

В командной строке выполняем команды:

pip install virtualenv
pip install virtualenvwrapper-win

Установка VirtualEnv и VirtualEnvWrapper в Ubuntu

Для Ubuntu команда установки будет следующей:

pip3 install --user virtualenv virtualenvwrapper

После которой в конец ~/.bashrc добавляем:

export VIRTUALENVWRAPPER_PYTHON=/usr/bin/python3
source ~/.local/bin/virtualenvwrapper.sh

При новом запуске терминала должны будут появиться сообщения, начинающиеся на virtualenvwrapper.user_scripts creating, что говорит об успешном завершении установки.

Работа с виртуальным окружением VirtualEnv

Рассмотрим основные команды при работе с VirtualEnv в командой строке Windows и в терминале Ubuntu.

Находясь в одном из окружений, можно ставить пакеты через Pip, как обычно и нет необходимости добавлять ключ --user:

pip3 install markdown

Для Windows можно указать в переменных среды WORKON_HOME для переопределения пути, где хранятся виртуальные окружения. По умолчанию, используется путь %USERPROFILE%Envs.

Установка PyCharm

PyCharm — интегрированная среда разработки для языка программирования Python. Обладает всеми базовыми вещами необходимых для разработки. В нашем случае огромное значение имеет хорошее взаимодействие PyCharm с VirtualEnv и Pip, чем мы и будем пользоваться.

Установка PyCharm в Windows

Скачиваем установщик PyCharm Community для Windows с официального сайта JetBrains. Если умеете проверять контрольные суммы у скаченных файлов, то не забываем это сделать.

В самой установке ничего особенного нету. По сути только нажимаем на кнопки next, и в завершение на кнопку Install. Единственно, можно убрать версию из имени папки установки, т.к. PyCharm постоянно обновляется и указанная версия в будущем станет не правильной.

Установка PyCharm в Ubuntu

Скачиваем установщик PyCharm Community для Linux с официального сайта JetBrains. Очень хорошей практикой является проверка контрольных сумм, так что если умеете, не ленитесь с проверкой.

Распаковываем архив с PyCharm и переименовываем папку с программой в pycharm-community, убрав версию из названия.

Теперь в директории ~/.local (Ctrl + H — Показ скрытый файлов), создаем папку opt, куда и перемещаем pycharm-community. В результате по пути /.local/opt/pycharm-community должны размещаться папки bin, help и т.д. Таким образом PyCharm будет находится в своём скромном месте и никому не будет мешать.

Далее выполняем команды в терминале:

cd /home/maksim/.local/opt/pycharm-community/bin
sh ./pycharm.sh

Производим установку. И очень важно в конце не забыть создать desktop файл для запуска PyCharm. Для этого в Окне приветствия в нижнем правом углу нажимаем на ConfigureCreate Desktop Entry.

Создание desktop файла

Установка PyCharm в Ubuntu из snap-пакета

PyCharm теперь можно устанавливать из snap-пакета. Если вы используете Ubuntu 16.04 или более позднюю версию, можете установить PyCharm из командной строки.

sudo snap install pycharm-community --classic

Использование VirtualEnv и Pip в PyCharm

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

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

  1. Создаём проект со своим собственным виртуальным окружением, куда затем будут устанавливаться необходимые библиотеки;
  2. Предварительно создаём виртуальное окружение, куда установим нужные библиотеки. И затем при создании проекта в PyCharm можно будет его выбирать, т.е. использовать для нескольких проектов.

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

Создадим программу, генерирующую изображение с тремя графиками нормального распределения Гаусса Для этого будут использоваться библиотеки matplotlib и numpy, которые будут установлены в специальное созданное виртуальное окружение для программы.

Запускаем PyCharm и окне приветствия выбираем Create New Project.

В мастере создания проекта, указываем в поле Location путь расположения создаваемого проекта. Имя конечной директории также является именем проекта. В примере директория называется ‘first_program’.

Далее разворачиваем параметры окружения, щелкая по Project Interpreter. И выбираем New environment using Virtualenv. Путь расположения окружения генерируется автоматически. В Windows можно поменять в пути папку venv на Envs, чтобы команда workon находила создаваемые в PyCharm окружения. Ставить дополнительно галочки — нет необходимости. И нажимаем на Create.

Настройка первой программы в PyCharm

Теперь установим библиотеки, которые будем использовать в программе. С помощью главного меню переходим в настройки FileSettings. Где переходим в Project: project_nameProject Interpreter.

Чистое окружение у проекта

Здесь мы видим таблицу со списком установленных пакетов. В начале установлено только два пакета: pip и setuptools.

Справа от таблицы имеется панель управления с четырьмя кнопками:

  • Кнопка с плюсом добавляет пакет в окружение;
  • Кнопка с минусом удаляет пакет из окружения;
  • Кнопка с треугольником обновляет пакет;
  • Кнопка с глазом включает отображение ранних релизов для пакетов.

Для добавления (установки) библиотеки в окружение нажимаем на плюс. В поле поиска вводим название библиотеки. В данном примере будем устанавливать matplotlib. Дополнительно, через Specify version можно указать версию устанавливаемого пакета и через Options указать параметры. Сейчас для matplotlib нет необходимости в дополнительных параметрах. Для установки нажимаем Install Package.

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

После установки закрываем окно добавления пакетов в проект и видим, что в окружение проекта добавился пакет matplotlib с его зависимостями. В том, числе был установлен пакет с библиотекой numpy. Выходим из настроек.

Теперь мы можем создать файл с кодом в проекте, например, first.py. Код программы имеет следующий вид:

import matplotlib.pyplot as plt
import numpy as np

x = np.linspace(-5, 5, 100)

def gauss(sigma, mu):
    return 1/(sigma * (2*np.pi)**.5) * np.e ** (-(x-mu)**2/(2 * sigma**2))

dpi = 80
fig = plt.figure(dpi=dpi, figsize=(512 / dpi, 384 / dpi))

plt.plot(x, gauss(0.5, 1.0), 'ro-')
plt.plot(x, gauss(1.0, 0.5), 'go-')
plt.plot(x, gauss(1.5, 0.0), 'bo-')

plt.legend(['sigma = 0.5, mu = 1.0',
            'sigma = 1.0, mu = 0.5',
            'sigma = 1.5, mu = 0.0'], loc='upper left')

fig.savefig('gauss.png')

Для запуска программы, необходимо создать профиль с конфигурацией. Для этого в верхнем правом углу нажимаем на кнопку Add Configuration…. Откроется окно Run/Debug Configurations, где нажимаем на кнопку с плюсом (Add New Configuration) в правом верхнем углу и выбираем Python.

Далее указываем в поле Name имя конфигурации и в поле Script path расположение Python файла с кодом программы. Остальные параметры не трогаем. В завершение нажимаем на Apply, затем на OK.

Создание конфигурации для Python программы

Теперь можно выполнить программу и в директории с программой появится файл gauss.png:

Графики нормального распределение гаусса

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

Данный пример можно использовать во время изучения работы с библиотекой. Например, изучаем PySide2 и нам придется создать множество проектов. Создание для каждого проекта отдельного окружения довольно накладно. Это нужно каждый раз скачивать пакеты, также свободное место на локальных дисках ограничено.

Более практично заранее подготовить окружение с установленными нужными библиотеками. И во время создания проектов использовать это окружение.

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

Начнем с экран приветствия PyCharm. Для этого нужно выйти из текущего проекта. На экране приветствия в нижнем правом углу через ConfigureSettings переходим в настройки. Затем переходим в раздел Project Interpreter. В верхнем правом углу есть кнопка с шестерёнкой, нажимаем на неё и выбираем Add…, создавая новое окружение. И указываем расположение для нового окружения. Имя конечной директории будет также именем самого окружения, в данном примере — pyside2. В Windows можно поменять в пути папку venv на Envs, чтобы команда workon находила создаваемые в PyCharm окружения. Нажимаем на ОК.

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

Далее в созданном окружении устанавливаем пакет с библиотекой PySide2, также как мы устанавливали matplotlib. И выходим из настроек.

Теперь мы можем создавать новый проект использующий библиотеку PySide2. В окне приветствия выбираем Create New Project.

В мастере создания проекта, указываем имя расположения проекта в поле Location. Разворачиваем параметры окружения, щелкая по Project Interpreter, где выбираем Existing interpreter и указываем нужное нам окружение pyside2.

Создание нового проекта использующего библиотеку PySide2

Для проверки работы библиотеки создаем файл second.py со следующий кодом:

import sys

from PySide2.QtWidgets import QApplication, QLabel
from PySide2 import QtCore

if __name__ == "__main__":
    app = QApplication(sys.argv)

    label = QLabel(QtCore.qVersion())
    label.show()

    QtCore.qVersion()

    sys.exit(app.exec_())

Далее создаем конфигурацию запуска программы, также как создавали для первого примера. После чего можно выполнить программу.

Заключение

У меня нет богатого опыта программирования на Python. И я не знаком с другими IDE для Python. Поэтому, возможно, данные IDE также умеют работать с Pip и Virtualenv. Использовать Pip и Virtualenv можно в командой строке или в терминале. Установка библиотеки через Pip может завершиться ошибкой. Есть способы установки библиотек без Pip. Также создавать виртуальные окружения можно не только с помощью Virtualenv.

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

Продолжаем серию “Python.Уроки”. На этот раз мы изучим, что такое виртуальные окружения в Python, зачем они нужны и как их использовать. Познакомимся с инструментами virtualenv и venv для создания виртуальных окружений.

  • Что такое виртуальное окружение и зачем оно нужно?
  • ПО позволяющее создавать виртуальное окружение в Python
  • virtualenv
    • Установка virtualenv
    • Создание виртуального окружения
    • Активация виртуального окружения
    • Деактивация виртуального окружения
  • venv
    • Создание виртуального окружения
    • Активация виртуального окружения
    • Деактивация виртуального окружения
  • Полезные ссылки

Что такое виртуальное окружение и зачем оно нужно?

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

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

Во-вторых: может возникнуть необходимость в том, чтобы запретить вносить изменения в приложение на уровне библиотек, т.е. вы установили приложение и хотите, чтобы оно работало независимо от того обновляются у вас библиотеки или нет. Как вы понимаете, если оно будет использовать библиотеки из глобального хранилища (/usr/lib/pythonXX/site-packages), то, со временем, могут возникнуть проблемы.

В-третьих: у вас просто может не быть доступа к каталогу /usr/lib/pythonXX/site-packages.

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

Программное обеспечение, которое позволяет создавать виртуальные окружения в Python можно разделить на те, что входят в стандартную библиотеку Python и не входят в нее. Сделаем краткий обзор доступных инструментов (хороший пост на эту тем есть на stackoverflow).

Начнем с инструментов, которые входят в PyPI. Если кто не знает PyPI – это Python Package Index (PyPI) – репозиторий пакетов Python, доступный для любого разработчика и пользователя Python ().

virtualenv

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

pyenv

Инструмент для изоляции версий Python. Чаще всего применяется, когда на одной машине вам нужно иметь несколько версий интерпретатора для тестирования на них разрабатываемого вами ПО.

virtualenvwrapper

Virtualenvwrapper – это обертка для virtualenv позволяющая хранить все изолированные окружения в одном месте, создавать их, копировать и удалять. Предоставляет удобный способ переключения между окружениями и возможность расширять функционал за счет plug-in’ов.

Существуют ещё инструменты и plug-in’ы, выполняющие работу по изоляции частей системы Python, но мы их не будем рассматривать.

Инструменты, входящие в стандартную библиотеку Python.

venv

Этот модуль появился в Python3 и не может быть использован для решения задачи изоляции в Python2. По своему функционалу очень похож на virtualenv. Если вы работаете с третьим Python, то можете смело использовать данный инструмент.

virtualenv

Будем рассматривать работу с virtualenv в рамках операционной системы Linux. Для Windows все будет очень похоже, за исключением моментов, связанных со спецификой этой ОС: названия и расположение каталогов, запуск скриптов оболочки и т.п.

Установка virtualenv

Virtualenv можно установить с использованием менеджера pip (ссылка на статью), либо скачать исходные коды проекта и установить приложение вручную.

Установка с использованием pip.

Для установки virtualenv откройте консоль и введите следующую команду:

> pip install virtualenv

Установка из исходного кода проекта.

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

Введите в консоли следующий набор команд:

> curl -O https://pypi.python.org/packages/source/v/virtualenv/virtualenv-X.X.tar.gz
> tar xvfz virtualenv-X.X.tar.gz
> cd virtualenv-X.X
>  [sudo] python setup.py install

X.X – это версия приложения, ее вам нужно знать заранее.

Если использовать ключевое слово sudo, инструмент будет установлен глобально, в противном случае – локально.

Мы рекомендуем вам использовать pip для установки virtualenv.

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

Виртуальное окружение создается следующей командой:

> virtualenv PRG1

PRG1 в данном случае – это имя окружения.

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

RPG1/bin/ – содержит скрипты для активации/деактивации окружения, интерпретатор Python, используемый в рамках данного окружения, менеджер pip и ещё несколько инструментов, обеспечивающих работу с пакетами PythonВ Windows, это каталог PRG1Scripts

PRG1/include/ и PRG1/lib/ – каталоги, содержащие библиотечные файлы окружения. Новые пакеты будут установлены в каталог PRG1/lib/pythonX.X/site-packages/.

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

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

> source PRG1/bin/activate

для Windows команда будет выглядеть так:

> PRG1Scriptsactivate.bat

Команда source выполняет bash-скрипт без запуска второго bash-процесса.

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

virtual environment

При этом в переменную окружения PATH, в самое начало, будет добавлен путь до директории bin, созданного каталога RPG1.

Если вы создадите виртуальное окружение с ключем –system-site-packages:

> virtualenv --system-site-packages PRG1

то в рамках окружения PRG1 вы будите иметь доступ к глобальному хранилищу пакетов:

    • в Linux: /usr/lib/pythonX.X/site-packages
  • в Windows: PythonXXLibsite-packages

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

Для деактивации виртуального окружения (выхода из него), введите команду deactivate для Linux или deactivate.bat, если вы работаете в Windows.

> deactivate

virtual environment deactivate

venv

Устанавливать venv не нужно, т.к. он входит в стандартную библиотеку Python. Т.е. если вы установили себе Python, то venv у вас уже есть. Помните, что venv работает только в Python3!

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

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

> python -m venv PRG2

В результате будет создан каталог PRG2 со структурой похожей на ту, что была описана для virtualenv. Функциональное назначение каталогов тоже самое.

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

Активация виртуального окружения в Linux выполняется командой:

>source PRG2/bin/activate

в Windows:

>PRG2Scriptsactivate.bat

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

Деактивация выполняется командой deactivate (работает как в Windows, так и в Linux)

>deactivate

Полезные ссылки

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

Официальная документация

Документация по virtualenv

Документация по virtualenvwrapper

Документация по venv

Статьи

Python. Строим виртуальное окружение с помощью virtualenv

Памятка по virtualenv и изолированным проектам на Python

P.S.

Если вам интересна тема анализа данных, то мы рекомендуем ознакомиться с библиотекой Pandas. На нашем сайте вы можете найти вводные уроки по этой теме. Все уроки по библиотеке Pandas собраны в книге “Pandas. Работа с данными”.
Книга: Pandas. Работа с данными

<<< Python. Урок 16. Установка пакетов в Python    Python. Урок 18. Аннотация типов в Python>>>

Содержание:развернуть

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

  • Активация

  • Автоматическая активация

  • Деактивация

  • Альтернативы venv

Все сторонние пакеты устанавливаются менеджером PIP глобально. Проверить это можно просто командой pip show <имя_пакета>.

root@purplegate:~# pip3 show pytest
Name: pytest
Version: 5.3.2
Summary: pytest: simple powerful testing with Python
Home-page: https://docs.pytest.org/en/latest/
Author: Holger Krekel, Bruno Oliveira, Ronny Pfannschmidt, ...
License: MIT license
Location: /usr/local/lib/python3.8/site-packages
Requires: more-itertools, pluggy, py, wcwidth, attrs, packaging
Required-by:

Location — путь до ваших глобальных пакетов.

В большинстве случаев, устанавливать пакеты глобально — плохая идея 🙅‍♂️ Почему? Рассмотрим простой пример:

Допустим у нас есть два проекта: «Project A» и «Project B». Оба проекта зависят от библиотеки Simplejson. Проблема возникает, когда для «Project A» нужна версия Simplejson 3.0.0, а для проекта «Project B» — 3.17.0. Python не может различить версии в глобальном каталоге site-packages — в нем останется только та версия пакета, которая была установлена последней.

Решение данной проблемы — создание виртуального окружения (virtual environment).

Основная цель виртуального окружения Python — создание изолированной среды для python-проектов

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

Настройка виртуального окружения

Один из самых популярных инструментов для создания виртуального окружения — virtualenv. Однако в данной статье мы будем рассматривать более свежий инструмент venv.

Устанавливать venv не нужно — он входит в стандартную библиотеку Python

Создание

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

python -m venv venv

Флаг -m указывает Python-у запустить venv как исполняемый модуль.
venv/ — название виртуального окружения (где будут храниться ваши библиотеки).

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

Новые пакеты будут устанавливаться в venv/lib/python3.x/site-packages/

Активация

Чтобы начать пользоваться виртуальным окружением, необходимо его активировать:

  • venvScriptsactivate.bat — для Windows;
  • source venv/bin/activate — для Linux и MacOS.

source выполняет bash-скрипт без запуска дополнительного bash-процесса.

Проверить успешность активации можно по приглашению оболочки. Она будет выглядеть так:

(venv) root@purplegate:/var/test#

Также новый путь до библиотек можно увидеть выполнив команду:

python -c "import site; print(site.getsitepackages())"

Интересный факт: в виртуальном окружении вместо команды python3 и pip3, можно использовать python и pip

Автоматическая активация

В некоторых случаях, процесс активации виртуального окружения может показаться неудобным (про него можно банально забыть 🤷‍♀️).

На практике, для автоматической активации перед запуском скрипта, создают скрипт-обертку на bash:

#!/usr/bin/env bash

source $BASEDIR/venv/bin/activate
python $BASEDIR/my_app.py

Теперь можно установить права на исполнение и запустить нашу обертку:

chmod +x myapp/run.sh
./myapp/run.sh

Деактивация

Закончив работу в виртуальной среде, вы можете отключить ее, выполнив консольную команду:

deactivate

Альтернативы venv

На данный момент существует несколько альтернатив для venv:

  • pipenv — это pipfile, pip и virtualenv в одном флаконе;
  • pyenv — простой контроль версий Питона;
  • poetry — новый менеджер для управления зависимостями;
  • autoenv — среды на основе каталогов;
  • pew — инструмент для управления несколькими виртуальными средами, написанными на чистом Python;
  • rez — интегрированная система конфигурирования, сборки и развертывания пакетов для программного обеспечения.

Стоит ли использовать виртуальное окружение в своей работе — однозначно да. Это мощный и удобный инструмент изоляции проектов друг от друга и от системы. С помощью виртуального окружения можно использовать даже разные версии Python!

Однако рекомендуем присмотреться к более продвинутым вариантам, например к pipenv или poetry.

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

Зачем нужна виртуальная среда?

Python, как и большая часть других современных языков программирования, имеет собственный, уникальный способ загрузки, хранения и разрешения пакетов (или модулей). Это имеет свои преимущества, однако были принятые некоторые интересные решения, на счет хранения и разрешения пакетов, которые привели к определенным проблемам, а именно: как и где эти пакеты хранятся?

Содержание

  1. Зачем нужна виртуальная среда?
  2. Что такое виртуальная среда?
  3. Использование виртуальной среды
  4. Как работает виртуальная среда?
  5. Управление виртуальной средой при помощи virtualenvwrapper
  6. Использование разных версий Python
  7. Вывод

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

Есть вопросы по Python?

На нашем форуме вы можете задать любой вопрос и получить ответ от всего нашего сообщества!

Telegram Чат & Канал

Вступите в наш дружный чат по Python и начните общение с единомышленниками! Станьте частью большого сообщества!

Паблик VK

Одно из самых больших сообществ по Python в социальной сети ВК. Видео уроки и книги для вас!

На Mac OS X, вы можете легко найти, где именно sys.prefix указывает на использование оболочки Python:

import sys

print(sys.prefix) # ‘/System/Library/Frameworks/Python.framework/Versions/3.5’

К нашей статье в большей мере относятся сторонние пакеты, установленные при помощи easy_install или pip, обычно располагаются в одном из каталогов, на которую указывает site.getsitepackages:

import site

data = site.getsitepackages()

print(data)

Результат:

[

  ‘/System/Library/Frameworks/Python.framework/Versions/3.5/Extras/lib/python’,

  ‘/Library/Python/3.5/site-packages’

]

Зачем нам все эти детали?

Очень важно иметь представление об этом, так как по умолчанию, каждый объект вашей системы будет использовать одинаковые каталоги для хранения и разрешения пакетов (сторонних библиотек. На первый взгляд это не выглядит чем-то значительным. Это так, но только в отношении системных пакетов, являющихся частью стандартной библиотеки Python – но сторонние пакеты – это другое дело.

Представим следующий сценарий, где у вас есть два проекта: проект А и проект Б, которые оба имеют зависимость от одной и той же библиотеки – проект В. Проблема становится явной, когда мы начинаем запрашивать разные версии проекта В. Может быть так, что проект А запрашивает версию 1.0.0, в то время как проект Б запрашивает более новую версию 2.0.0, к примеру.

Это большая проблема Python, поскольку он не может различать версии в каталоге «site-packages». Так что обе версии 1.0.0 и 2.0.0 будут находиться с тем же именем в одном каталоге:

/System/Library/Frameworks/Python.framework/Versions/3.5/Extras/lib/python/ProjectC

И так как проекты хранятся в соответствии с их названиями, то нет различий между версиями. Таким образом, проекты А и Б должны будут использовать одну и ту же версию, что во многих случаях неприемлемо.

Тут-то и вступает в игру виртуальная среда (вместе с инструментами virtualenv/ven)

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

В корне своем, главная задача виртуальной среды Python – создание изолированной среды для проектов Python.

Это значит, что:

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

И так, в нашем небольшом примере вверху, нам просто нужно создать раздельную виртуальную среду для проектов А и Б. Каждая среда, в свою очередь, сможет зависеть от любой версии проекта В, независимо друг от друга.

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

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

Перед тем, как начать: если вы не пользуетесь Python 3, вам нужно будет установить инструмент virtualenv при помощи pip:

Если вы используете Python 3, у вас уже должен быть модуль venv, установленный в стандартной библиотеке.

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

Начнем с создания нового каталога, с которым мы будем работать:

mkdir pythonvirtualenvironments && cd pythonvirtualenvironments

Создание новой виртуальной среды внутри каталога:

# Python 2:

$ virtualenv env

# Python 3

$ python3 m venv env

По умолчанию, это не включает в себя ни один из существующих сторонних пакетов.

Подход venv в Python 3 обладает преимуществом, которое вынуждает вас использовать определенную версию интерпретатора Python 3, который будет использован для создания виртуальной среды. Таким образом, вы избегаете недоразумений при выяснении, какая инсталляция Python базируется в новой виртуальной среде.

Начиная с Python 3.3 и 3.4, рекомендуемый способ создания виртуального пространства – это использование инструмента командной строки pyvenv, который также включен в инсталляцию вашего Python 3 по умолчанию. Однако, в версии 3.6 и выше, вам нужен python3 -m venv.

В примере выше, эта команда создает каталог под названием «env», структура каталога которого схожа со следующей:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

├── bin

   ├── activate

   ├── activate.csh

   ├── activate.fish

   ├── easy_install

   ├── easy_install3.5

   ├── pip

   ├── pip3

   ├── pip3.5

   ├── python -> python3.5

   ├── python3 -> python3.5

   └── python3.5 -> /Library/Frameworks/Python.framework/Versions/3.5/bin/python3.5

├── include

├── lib

   └── python3.5

       └── sitepackages

└── pyvenv.cfg

Что находится в этих папках?

  • bin – файлы, которые взаимодействуют с виртуальной средой;
  • include – С-заголовки, компилирующие пакеты Python;
  • lib – копия версии Python вместе с папкой «site-packages», в которой установлена каждая зависимость.

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

Более интересные сейчас – скрипты activate в папке bin. Эти скрипты используются для настройки вашей оболочки для использования исполняемого файла среды Python и его сайтовых пакетов по умолчанию.

Чтобы использовать эти пакеты (или ресурсы) среды в изоляции, вам нужно «активировать» их. Чтобы сделать это, просто запустите:

Обратите внимание на то, что ваше приглашение командной строки теперь носит префикс вашей среды (в нашем случае – env). Это индикатор того, что env в данный момент активен, что в свою очередь говорит о том, что выполнимые файлы Python используют пакеты и настройки только этой среды.

Чтобы показать изолированный пакет в действии, мы можем использовать модуль bcrypt в качестве примера. Скажем, что модуль bcrypt установлен где-нибудь в системе, но не в нашей виртуальной среде.

Перед тем как проверить это, нам нужно вернуться назад в контекст «system» , выполнив команду deactivate:

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

Теперь установим bcrypt и используем его для хеширования пароля:

$ pip q install bcrypt

$ python c «import bcrypt; print(bcrypt.hashpw(‘password’.encode(‘utf-8’), bcrypt.gensalt()))»

$2b$12$vWa/VSvxxyQ9d.WGgVTdrell515Ctux36LCga8nM5QTW0.4w8TXXi

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

$ source env/bin/activate

(env) $ python c «import bcrypt; print(bcrypt.hashpw(‘password’.encode(‘utf-8’), bcrypt.gensalt()))»

Traceback (most recent call last):

  File «<string>», line 1, in <module>

ImportError: No module named ‘bcrypt’

Как мы видим, поведение команды the python -c «import bcrypt…» меняется после вызова источника env/bin/activate.

В одном примере, у нас есть доступный нам bcrypt, а в другом его нет. Это тот тип разделения, который мы ищем для виртуальной среды, и мы к нему пришли.

Как работает виртуальная среда?

Что именно имеется ввиду под «активировать» среду? Понимание того, что именно происходит под капотом, может быть очень важно для разработчика, особенно когда вам нужно понять выполнение виртуальной среды, разрешение зависимостей, и так далее.

Чтобы объяснить, как это работает, для начала проверим расположения разных исполняемых файлов python. С «деактивированной» средой запускаем:

$ which python

/usr/bin/python

Теперь активируем и снова запустим команду:

$ source env/bin/activate

(env) $ which python

/Users/michaelherman/pythonvirtualenvironments/env/bin/python

Активировав среду, мы теперь получаем другой путь к исполнимому файлу python, так как в активной среде, переменная среды $PATH несколько отличается.

Обратите внимание на разницу между первым путем в $PATH до и после активации:

$ echo $PATH

/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:

$ source env/bin/activate

(env) $ echo $PATH

/Users/michaelherman/pythonvirtualenvironments/env/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:

В последнем примере, каталог bin нашей виртуальной среды теперь находится в начале пути. Это значит, что это первый каталог в поиске, когда мы запускаем исполняемый файл в командной строке. Таким образом, оболочка использует экземпляр нашей виртуальной среды в Python, а не в системной версии.

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

Это наталкивает на вопросы:

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

Это можно объяснить тем, как Python запускается и где он расположен в системе. Нет разницы между двумя исполняемыми файлами Python. Суть заключается в расположении каталога

Когда Python запускается, он ищет путь своего двоичного файла (в виртуальной среде он является копией или символической ссылке системного бинарного файла Python). Далее, он устанавливает расположение sys.prefix и sys.exec_prefix согласно с этим расположением, опуская часть bin в пути.

Путь, находящийся в sys.prefix далее используется для поиска каталога site-packages, путем поиска по связанного с ним пути lib/pythonX.X/site-packages/, где Х.Х – это версия используемого вами Python.

В нашем примере, бинарный файл расположен в /Users/michaelherman/python-virtual-environments/env/bin, это значит, что sys.prefix может быть /Users/michaelherman/python-virtual-environments/env, следовательно, используемый каталог site-packages может быть /Users/michaelherman/python-virtual-environments/env/lib/pythonX.X/site-packages. Наконец, этот путь наложен в массиве sys.path, который содержит все расположения, которые пакет может использовать.

Управление виртуальной средой при помощи virtualenvwrapper

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

Самые полезные функции virtualenvwrapper:

  • Организация каждой виртуальной среды в одном расположении;
  • Предоставляются методы, которые помогут вам легко создавать, удалять и копировать виртуальную среду, а также,
  • Предоставляет одну команду для переключения между средами

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

Перед началом, вы можете скачать обёртку при помощи pip:

$ pip install virtualenvwrapper

Для Windows нужно использовать virtualenvwrapper-win

После завершения установки, нам нужно активировать его функции оболочки. Это можно сделать, запустив источник установленного скрипта virtualenvwrapper.sh. Кода вы в первый раз устанавливаете его при помощи pip, выдача установки укажет вам точное расположение virtualenvwrapper.sh. Впрочем, вы можете просто запустить команду:

$ which virtualenvwrapper.sh

/usr/local/bin/virtualenvwrapper.sh

Используя данный путь, добавьте следующие три строки в стартовый файл вшей оболочки. Если оболочку Bash, вы можете разместить эти строки и в файле ~/.bashrc file or ~/.profile. Для других оболочек, таких как zsh, csh или fish, вам может понадобиться определенные файлы запуска для этой оболочки. Главное, чтобы эти команды выполнялись при открытии новой оболочки или входе в неё.

export WORKON_HOME=$HOME/.virtualenvs   # optional

export PROJECT_HOME=$HOME/projects      # optional

source /usr/local/bin/virtualenvwrapper.sh

От нас не требуется определять переменные виртуальной среды WORKON_HOME и PROJECT_HOME. В virtualenvwrapper имеются установленные по умолчанию переменные для них, но вы можете перезаписать их, указав значения.

Наконец, перезагружаем файл запуска:

Теперь здесь должен быть каталог, расположенный в $WORKON_HOME, который содержит все данные и файлы virtualenvwrapper:

$ echo $WORKON_HOME

/Users/michaelherman/.virtualenvs

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

  • workon
  • deactivate
  • mkvirtualenv
  • cdvirtualenv
  • rmvirtualenv

Для дополнительной информации о командах, установке и настройке virtualenvwrapper, вы можете ознакомиться с их документацией.

Теперь, когда бы вы не начинали новый проект, все что вам нужно, это:

$ mkvirtualenv mynewproject

(mynewproject) $

Это создаст и активирует новую виртуальную среду в каталоге, расположенном в $WORKON_HOME, где хранятся все среды virtualenvwrapper.

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

(mynewproject) $ deactivate

$

Если у вас есть широкий выбор виртуальных сред, вы можете отсортировать их по списку при помощи функции workon:

$ workon

mynewproject

mydjangoproject

webscraper

И, наконец, активировать:

$ workon webscraper

(webscraper) $

Если вы хотите иметь один инструмент и переключаться между версиями Python, virtualenv позволит вам это сделать. Virtualenv содержит параметр , который позволяет вам выбрать, какую версию Python использовать. Совместите это с командой which, и мы можем быстро выбрать предпочитаемую версию Python. К примеру, скажем, что мы хотим выбрать Python 3 в качестве нашей основной версии:

$ virtualenv p $(which python3) blog_virtualenv

Это создаст новую среду python3.

Так как же это работает? Команда which используется для поиска переданной команды в вашей переменной $PATH и возвращает полный путь к этой команде. Так, полный путь к Python3 вернулся параметру , который в свою очередь принимает PYTHON_EXE. Это также можно практиковать и в Python2. Просто замените python3 на python2 (или python, если вы используете python2 по умолчанию).

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

В отличие от старого virtualenv, pyvenv не поддерживает создание виртуальной среды в произвольных версиях Python. Это значит, что вам придется использовать установленный Python 3 по умолчанию для каждой создаваемой вами виртуальной среды. Хотя вы можете обновить среду до последней системной версии Python (через опцию –upgrade) если она поменялась, вы все еще не можете указывать конкретную версию.

Существует предостаточно способов установить Python, но только некоторые из них достаточно простые или гибкие, чтобы повторно удалять и переустанавливать разные бинарные версии файлов.

Здесь и вступает в игру pyenv.

Несмотря на схожесть в названиях (pyvenv и pyenv), pyenv отличается тем, что он направлен на то, чтобы помочь переключаться между версиями Python на как на системном уровне, так и на проектном. Другими словами, задача pyvenv разделять модули, задача pyenv – разделять версии Python.

Вы можете начать с установки pyenv как при помощи Homebrew (на OS X), или при помощи проекта pyenv-installer:

Homebrew

pyenv-installer

$ curl L https://raw.githubusercontent.com/yyuu/pyenvinstaller/master/bin/pyenvinstaller | bash

К сожалению, pyenv не поддерживается Windows. Вы можете воспользоваться альтернативами в виде pywin и anyenv.

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

КОД # Install new version установка новой версии

КОД # Внесение установленных версий в список

КОД # Выполнение «python-V» с использованием версии pyenv

$ pyenv install 3.5.0   # Установка новой версии

$ pyenv versions        # Внесение установленных версий в список

$ pyenv exec python V  # Выполнение «python-V» с использованием версии pyenv

Этими тремя строками мы устанавливаем версию Python 3.5.0, просим pyenv показать все доступные нам версии, после чего выполнить команду python –V, используя определенную pyenv версию.

Чтобы дать вам больше контроля, вы можете использовать любую доступную версию как для «глобального», так и «локального». Использование pyenv с локальными командами настраивает версию Python на определенный проект или директорию, сортируя версию в локальном файле .python-version. Мы можем настроить «локальную» версию следующим образом:

Это создает файл .python-version в нашем текущем каталоге, как вы можете видеть здесь:

$ ls la

total 16

drwxrxrx  4 michaelherman  staff  136 Feb 22 10:57 .

drwxrxrx  9 michaelherman  staff  306 Jan 27 20:55 ..

rwrr  1 michaelherman  staff    7 Feb 22 10:57 .pythonversion

rwrr  1 michaelherman  staff   52 Jan 28 17:20 main.py

Этот файл содержит только «2.7.11». Теперь, когда вы запускаете скрипт при помощи pyenv, он загрузит этот файл, и использует определенную версию, предполагая, что он действителен и существует в вашей системе.

Двигаясь дальше с нашим примером, предположим, что у нас есть простой скрипт, под названием main.py в нашем проектном каталоге, который выглядит следующим образом:

import sys

print(‘Using version:’, sys.version[:5])

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

$ python main.py

Using version: 2.7.5

$ pyenv global 3.5.0

$ pyenv exec python main.py

Using version: 3.5.0

$ pyenv local 2.7.11

$ pyenv exec python main.py

Using version: 2.7.11

Обратите внимание на то, как pyenv exec python main.py использует нашу «глобальную» версию Python по умолчанию, но затем он использует «локальную» версию после ее установки в текущий каталог.

Это может быть мощным орудием для разработчиков, работающих со множеством проектов с различными требованиями к версии. Вы можете не только изменить версию по умолчанию для всех проектов (через global), но также переопределять ее для указания особых случаев.

Вывод

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

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

Являюсь администратором нескольких порталов по обучению языков программирования Python, Golang и Kotlin. В составе небольшой команды единомышленников, мы занимаемся популяризацией языков программирования на русскоязычную аудиторию. Большая часть статей была адаптирована нами на русский язык и распространяется бесплатно.

E-mail: vasile.buldumac@ati.utm.md

Образование
Universitatea Tehnică a Moldovei (utm.md)

  • 2014 — 2018 Технический Университет Молдовы, ИТ-Инженер. Тема дипломной работы «Автоматизация покупки и продажи криптовалюты используя технический анализ»
  • 2018 — 2020 Технический Университет Молдовы, Магистр, Магистерская диссертация «Идентификация человека в киберпространстве по фотографии лица»

Если вы работали с несколькими проектами, в которых использовался Python, то наверняка вы встречались с проблемой поломки одного из проекта, потому что обновленная версия библиотеки для другого проекта, не применима для текущего. Т.е. если вы работаете с Python и не используете miniconda или anaconda, то установка и обновление библиотек python постоянно ломает ваши проекты. Эта проблема называется «Ад зависимостей».

Поэтому лучшим подходом будет создавать для каждого отдельного проекта свою среду. В этой статье будет рассмотрена библиотека venv для настройки Virtual Environment для Windows.

Виртуальная среда — это способ Python для разделения зависимостей между проектами.

Создание виртуальной среды — venv в Windows

venv -это пакет, поставляемый с Python 3.

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

Чтобы создать виртуальную среду, перейдите в каталог вашего проекта и запустите venv.

python3 -m venv venv

или

python -m venv venv

venv создаст виртуальную установку Python в директории venv.

Примечание: Вы должны исключить каталог виртуальной среды из своей системы управления версиями с помощью .gitignore.

Активация и деактивация виртуальной среды Python

Далее необходимо активировать виртуальную среду.

Для этого необходимо в консоли cmd запустить .venvScriptsactivate или файл .venvScriptsactivate.bat, или .venvScriptsActivate.ps1.

Префикс вашего рабочего каталога изменится (выделил желтым — venv)

Пока ваша виртуальная среда активирована, pip будет устанавливать пакеты в эту конкретную среду, и вы сможете импортировать и использовать пакеты в своем приложении Python.

Установка пакетов в виртуальную среду

Пример:

pip install requests

pip позволяет вам указать, какую версию пакета установить, используя спецификаторы версии. Например, чтобы установить определенную версию requests:

pip install requests==2.18.4

Как сохранить пакеты в файл requirements.txt

Pip может экспортировать список всех установленных пакетов и их версий с помощью freeze команды: pip freeze > requirements.txt.

Будет выведен список спецификаторов пакетов, таких как:

backports.entry-points-selectable==1.1.0
certifi==2021.5.30
charset-normalizer==2.0.3
distlib==0.3.2
filelock==3.0.12
idna==3.2
platformdirs==2.0.2
requests==2.26.0
six==1.16.0
urllib3==1.26.6
virtualenv==20.6.0

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

Установить пакеты из файла requirements.txt

pip install -r requirements.txt

Как запустить скрипт Python в виртуальной среде. Пример автоматизации с помощью cmd

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

"D:#python##envflask-appvenvScriptspython.exe" "D:#python##envflask-appapp.py"

Либо создать файл cmd с содержимым и запустить его:

@echo off
For /f "tokens=1-4 delims=/ " %%a in ('date /t') do (set mydate=%%c-%%a-%%b)
For /f "tokens=1-2 delims=/:" %%a in ('time /t') do (set mytime=%%a%%b)
rem %mydate%_%mytime%

"D:#python##envflask-appvenvScriptspython.exe" "D:#python##envflask-appapp.py" 2>"D:#python##envflask-applog_get_data_log_%mydate%_%mytime%.log"

Создание виртуальной среды с помощью PyCharm

Для более легкой работы с виртуальными средами на Windows рекомендую установить PyCharm (Community Edition бесплатная). При создании проекта он сам создаст виртуальную среду и будет запускать файл в этой виртуальной среде:

Новую виртуальную среду можно создать с помощью разных инструментов в Pycharm:

  • Virtualenv
  • Pipenv
  • Poetry
  • Conda

Создание виртуальной среды в Ubuntu 20.14

С помощью пакета venv

# Создаем директорию проекта
mkdir flask-app

# Переходим внутрь директории
cd flask-app
# Создаем среду myenv
python3 -m venv myenv

# Активируем среду
source myenv/bin/activate

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

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

(далее будет информация для начинающих специалистов, если вы уже профессионал — переходите сразу к следующему пункту)

Если у Вас не установлен Python, то скачиваем программу установки и устанавливаем в нужную директорию, не забываем поставить галочку (Add Python X.X to PATH).

Не всегда последняя версия дистрибутива – оптимальное решение, т.к. множество пакетов работает под определенные версии Python. Наиболее распространена версия 3.6.

Чтобы проверить, что Python установился правильно, в командной строке вводим команду — python —version:

Если в результате получаем ошибку о том, что «python не является внутренней или внешней командой…» — необходимо проверить наличие пути в переменных окружения. Проверить это можно в «переменных среды текущего пользователя»:

В данном случае Python установлен в директорию «D:WorkPython». Если в переменной Path прописаны эти пути, но все равно выскакивает ошибка, то перезагрузите компьютер.

С установкой разобрались, приступим к созданию окружения. Для этого создадим папку для нового проекта и запустим командную строку в новой директории. Для запуска используем команду cmd в строке пути:

В командной строке вводим команду: python -m venv new_proj_env

Где venv – инструмент для создания виртуального окружения, new_proj_env – произвольное имя, которое задали для данного окружения. В результате выполнения в папке с проектом появится новая директория с именем new_proj_env.

Для работы в рамках виртуального окружения, его необходимо активировать с помощью следующей команды: new_proj_envScriptsactivate

После активации название окружения должно появиться в скобках слева от пути к проекту:

Далее устанавливаем необходимые пакеты, для примера установим pandas и jupyter:

  • pip install pandas jupyter – здесь не нужно разделять имена пакетов запятыми,
  • pandas – пакет для работы с табличными данными,
  • jupyter – пакет для интерактивной работы с данными в браузере с помощью блокнота (jupyter notebook).

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

Для того, чтобы начать работу, осталось запустить блокнот, командой jupyter notebook:

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

Таким образом, чтобы на следующий день продолжить работу, необходимо:

  1. Перейти в папку с проектом;
  2. Активировать виртуальное окружение;
  3. Запустить jupyter notebook.

Вместо этого, создадим переменную окружения, которая будет выполнять все три пункта разом. Для этого снова зайдем в переменные окружения и создадим новую переменную:

Здесь мы задаем имя переменной, и через оператор «&» обозначаем команды:

  1. d: — переходим на диск D, т.к. в данном примере папка с проектом лежит на локальном диске D;
  2. cd D:WorkNew_Projec – переходим к расположению папки с проектом;
  3. new_proj_envScriptsactivate – активируем виртуальное окружение;
  4. jupyter notebook – запускаем блокнот.

Таким образом, чтобы на следующий день продолжить работу, потребуется ввести лишь имя переменной, заключенной в знак «%»:

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

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

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,
для установки пакетов в других форматах могут потребоваться дополнительные
действия, но давайте разберем самый распространённый и простой случай). Куда
именно происходит установка? Это можно узнать, выполнив следующую команду:

$ python -m site
sys.path = [
    '/Users/and-semakin',
    '/Users/and-semakin/.asdf/installs/python/3.8.2/lib/python38.zip',
    '/Users/and-semakin/.asdf/installs/python/3.8.2/lib/python3.8',
    '/Users/and-semakin/.asdf/installs/python/3.8.2/lib/python3.8/lib-dynload',
    '/Users/and-semakin/env/lib/python3.8/site-packages',
]
USER_BASE: '/Users/and-semakin/.local' (exists)
USER_SITE: '/Users/and-semakin/.local/lib/python3.8/site-packages' (doesn't exist)
ENABLE_USER_SITE: False

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

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

$ ls -l /Users/and-semakin/env/lib/python3.8/site-packages
total 8
drwxr-xr-x   3 and-semakin  awesome    96 Apr 18 17:39 __pycache__
-rw-r--r--   1 and-semakin  awesome   126 Apr 18 17:39 easy_install.py
drwxr-xr-x   7 and-semakin  awesome   224 Apr 18 17:39 pip
drwxr-xr-x   9 and-semakin  awesome   288 Apr 18 17:39 pip-19.2.3.dist-info
drwxr-xr-x   7 and-semakin  awesome   224 Apr 18 17:39 pkg_resources
drwxr-xr-x  42 and-semakin  awesome  1344 Apr 18 17:39 setuptools
drwxr-xr-x  11 and-semakin  awesome   352 Apr 18 17:39 setuptools-41.2.0.dist-info

Установим пакет:

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

$ ls -l /Users/and-semakin/env/lib/python3.8/site-packages
total 8
drwxr-xr-x   3 and-semakin  awesome    96 Apr 18 17:39 __pycache__
drwxr-xr-x   7 and-semakin  awesome   224 Apr 18 17:41 certifi
drwxr-xr-x   8 and-semakin  awesome   256 Apr 18 17:41 certifi-2020.4.5.1.dist-info
drwxr-xr-x  43 and-semakin  awesome  1376 Apr 18 17:41 chardet
drwxr-xr-x  10 and-semakin  awesome   320 Apr 18 17:41 chardet-3.0.4.dist-info
-rw-r--r--   1 and-semakin  awesome   126 Apr 18 17:39 easy_install.py
drwxr-xr-x  11 and-semakin  awesome   352 Apr 18 17:41 idna
drwxr-xr-x   8 and-semakin  awesome   256 Apr 18 17:41 idna-2.9.dist-info
drwxr-xr-x   7 and-semakin  awesome   224 Apr 18 17:39 pip
drwxr-xr-x   9 and-semakin  awesome   288 Apr 18 17:39 pip-19.2.3.dist-info
drwxr-xr-x   7 and-semakin  awesome   224 Apr 18 17:39 pkg_resources
drwxr-xr-x  21 and-semakin  awesome   672 Apr 18 17:41 requests
drwxr-xr-x   8 and-semakin  awesome   256 Apr 18 17:41 requests-2.23.0.dist-info
drwxr-xr-x  42 and-semakin  awesome  1344 Apr 18 17:39 setuptools
drwxr-xr-x  11 and-semakin  awesome   352 Apr 18 17:39 setuptools-41.2.0.dist-info
drwxr-xr-x  16 and-semakin  awesome   512 Apr 18 17:41 urllib3
drwxr-xr-x   8 and-semakin  awesome   256 Apr 18 17:41 urllib3-1.25.9.dist-info

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

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

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

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

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

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

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

# requirements.txt
requests==2.23.0

Проект Б:

# requirements.txt
requests==1.2.3

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

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

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

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

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

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

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

$ python -m venv <путь к виртуальному окружению>

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

# заходим в директорию с проектом
$ cd src/blog_source

# создаем виртуальное окружение прямо рядом с кодом в директории env
$ python -m venv env

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

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

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

$ env/bin/python -V
Python 3.8.2

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

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

$ ls -l env/
total 8
drwxr-xr-x  13 and-semakin  awesome  416 Apr 18 18:55 bin
drwxr-xr-x   2 and-semakin  awesome   64 Apr 18 18:55 include
drwxr-xr-x   3 and-semakin  awesome   96 Apr 18 18:55 lib
-rw-r--r--   1 and-semakin  awesome  113 Apr 18 18:55 pyvenv.cfg

$ ls -l env/bin/
total 88
-rw-r--r--  1 and-semakin  awesome  8471 Apr 18 18:55 Activate.ps1
-rw-r--r--  1 and-semakin  awesome  2218 Apr 18 18:55 activate
-rw-r--r--  1 and-semakin  awesome  1270 Apr 18 18:55 activate.csh
-rw-r--r--  1 and-semakin  awesome  2422 Apr 18 18:55 activate.fish
-rwxr-xr-x  1 and-semakin  awesome   268 Apr 18 18:55 easy_install
-rwxr-xr-x  1 and-semakin  awesome   268 Apr 18 18:55 easy_install-3.8
-rwxr-xr-x  1 and-semakin  awesome   250 Apr 18 18:55 pip
-rwxr-xr-x  1 and-semakin  awesome   250 Apr 18 18:55 pip3
-rwxr-xr-x  1 and-semakin  awesome   250 Apr 18 18:55 pip3.8
lrwxr-xr-x  1 and-semakin  awesome    59 Apr 18 18:55 python -> /Users/and-semakin/.asdf/installs/python/3.8.2/bin/python
lrwxr-xr-x  1 and-semakin  awesome     6 Apr 18 18:55 python3 -> python

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

$ which python
/Users/and-semakin/.asdf/shims/python
$ which pip
/Users/and-semakin/.asdf/shims/pip

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

$ source env/bin/activate
(env) $

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

# cmd
C:srcblog_source> envScriptsactivate.bat

# либо в PowerShell
PS C:srcblog_source> envScriptsActivate.ps1

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

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

(env) $ which python
/Users/and-semakin/src/blog_source/env/bin/python
(env) $ which pip
/Users/and-semakin/src/blog_source/env/bin/pip

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

(env) $ pip install requests flask whatever-you-need

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

(env) $ python make_money.py
Done! You are rich!

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

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

(env) $ deactivate
$ which python
/Users/and-semakin/.asdf/shims/python

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

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

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

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

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

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

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

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

error: could not create '/lib/python2.7/site-packages/poetry': Permission denied

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

  1. Угроза безопасности.

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

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

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

Как правильно:

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

    $ pip install --user poetry  # без sudo!
    

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

    $ python -m site --user-base
    /Users/and-semakin/.local
    

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

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

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

    $ sudo dnf install python-poetry
    

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

Выводы

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

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

  • poetry;
  • pipenv.

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

Полезно почитать:

  • Документация: https://docs.python.org/3/library/venv.html

Понравилась статья? Поделить с друзьями:
  • Как установить виртуалку на windows 10
  • Как установить виртуализацию на windows 10 без биоса
  • Как установить винду на телефон андроид на windows
  • Как установить виндовс 7 через windows 10
  • Как установить виджеты на рабочий стол windows 10 скачать