<style>
.reveal {
font-size: 28px;
}
/* .reveal p {
text-align: left;
} */
.reveal section img {
background:none;
border:none;
box-shadow:none;
}
</style>
# Менеджеры пакетов и виртуальных окружений для Python
Глеб Ерофеев, весна 2021
[TOC]
---
# Пакеты и модули в Python
* Пакет в Python – это каталог, включающий в себя другие каталоги и модули, но при этом дополнительно содержащий файл `__init__.py` Пакеты используются для формирования пространства имен, что позволяет работать с модулями через указание уровня вложенности (через точку).
* Модуль - файл с расширением .py. Предназначены для того, чтобы в них хранить часто используемые функции, классы, константы и т.п. Можно условно разделить модули и программы: программы предназначены для непосредственного запуска, а модули для импортирования их в другие программы. Стоит заметить, что модули могут быть написаны не только на языке Python, но и на других языках (например C)
---
# Зачем это все (виртуальные окружения)
* Изолированность - работе изолированного решения нельзя случайно помешать
* Воспроизводимость/Переносимость - на другом компьютере решение будет работать так же (без ощибок и выдавать те же результаты)
* Фиксирование версий библиотек
* Приложения vs библиотеки/пакеты
**Виртуальное окружение** - это изолированные настройки среды Python которые позволяют нам использовать определенные, нужные нам, библиотеки и их версии в нашем приложении. Эти настройки не зависят от настроек и ограничений системы на которой мы запускаем наше приложение.
Виртуальное окружение не фиксирует настройки системы и драйвера - для этого есть другие инструменты - например Docker
Пример [Сентябрь 2019: pandas.SparseDataFrame](https://pandas.pydata.org/docs/whatsnew/v0.25.0.html#deprecations)
---
# Виды менеджеров пакетов и виртуальных окружений:
* Pip - самый распостраненный менеджер пакетов
* Virtualenv - основа, самое первое виртуальное окружение
* Conda - пакеты + окружение + скомпилированные образы
* Pip + Virtualenv = Pipenv (мы рекомендуем этот вариант)
* Poetry - Новая инкарнация pipenv (проще управлять зависимостями)
| Фичи | Pip | Virtualenv | Conda | Pipenv | Poetry |
| --- | --- | -- |--|-------- |-------- |
| Уст./удал. пакетов | + | - | + | + | + |
| Вирт. окр. |-|+|+|+|+|
| Поддержка whl|-|-|+|+|+|
| Умная Фиксация окружения |-|-|-|+|+|
| Работа с зависимостями |-|-|-|+|+|
---
# Жизненный цикл виртуального окружения на примере pipenv
* Установка (один раз)
```shell=
pip install --user pipenv
```
* Активация виртуального окружения
```shell=
cd my_project
pipenv shell # входим в наше окружение
exit # выход из окружения
```
* Установка пакетов внутри окружения
```shell=
pipenv install pandas
```
* Фиксирование состояния (автоматически)
```shell=
pipenv install pandas==1.1.1
>>> Installing pandas==1.1.1...
>>> Adding pandas to Pipfiles [packages]...
>>> Installation Succeeded
>>> Pipfile.lock not found, creating...
>>> Locking [dev-packages] dependencies...
>>> Locking [packages] dependencies...
>>> Locking...Building requirements...
>>> Resolving dependencies...
pipenv lock #Фиксирование
```
* Запуск проекта в виртуальном окружении
```shell=
pipenv run python your_project.py
```
---
# Фиксирование состояния pipenv
* Pipfile
```
[[source]]
url = "https://pypi.org/simple"
verify_ssl = true
name = "pypi"
[packages]
pandas = "==1.1.1"
[dev-packages]
[requires]
python_version = "3.7"
```
* Pipfile.lock
```json=
{
"_meta": {
"hash": {
"sha256": "8d14434df45e0ef884d6c3f6e8048ba72335637a8631cc44792f52fd20b6f97a"
},
"host-environment-markers": {
"implementation_name": "cpython",
"implementation_version": "3.6.1",
"os_name": "posix",
"platform_machine": "x86_64",
"platform_python_implementation": "CPython",
"platform_release": "16.7.0",
"platform_system": "Darwin",
"platform_version": "Darwin Kernel Version 16.7.0: Thu Jun 15 17:36:27 PDT 2017; root:xnu-3789.70.16~2/RELEASE_X86_64",
"python_full_version": "3.6.1",
"python_version": "3.6",
"sys_platform": "darwin"
},
"pipfile-spec": 5,
"requires": {},
"sources": [
{
"name": "pypi",
"url": "https://pypi.python.org/simple",
"verify_ssl": true
}
]
},
"default": {
"certifi": {
"hashes": [
"sha256:54a07c09c586b0e4c619f02a5e94e36619da8e2b053e20f594348c0611803704",
"sha256:40523d2efb60523e113b44602298f0960e900388cf3bb6043f645cf57ea9e3f5"
],
"version": "==2017.7.27.1"
},
...
```
---
# Как устроено виртуальное окружение pipenv изнутри
```shell=
pipenv graph # Просмотр зграфа зависимостей
pipenv --venv
```
Виртуальное окружение физически - это папка внутри проекта или в определенном месте, в которую устанавливаються все библиотеки окружения. Именно поэтому внешние изменения на машине хосте не ломают проект в виртуальном окружении и наоборот.
---
# Резюме
* Фиксировать окружение - экономия сил и времени
* Фиксировать окружение - просто
* Мы будем пользоваться этим в наших проектах
---
# Семинар Pipenv
* Ставим pipenv ```pip install --user pipenv```
* Переходим в папку проекта ```cd [my_project]```
* Фиксируем версию питона в проекте`pipenv --python 3.8.3`
* Добавляем/удаляем пакеты ```pipenv install/uninstall <package>```
* Версии пакетов ```pipenv install <package>~=1.2|>=1.2|<=1.2|<1.2```
* Запуск и оболочка ```pipenv shell | exit```
* Фиксация зависимостей ```pipenv lock```
* Создаем requirements.txt ```pipenv lock -r > requirements.txt```
* Добавляем пакеты из requirements.txt ```pipenv install -r requirements.txt```
* Обновление зависимостей ```pipenv update --outdated | pipenv update | pipenv update <package>```
* Анализ зависимостей ```pipenv graph```
___
# Домашнее задание
* Разобраться с poetry и выбрать себе любимую среду
* Создать окружение для своего проекта с паролями
* Разместить в обновленное решение в git
* Опубликовать в чате ссылку на репозиторий
* Посмотреть решения других участников - если понравилось ставим * в гите
{"metaMigratedAt":"2023-06-15T18:07:25.109Z","metaMigratedFrom":"YAML","title":"Менеджеры пакетов и виртуальных окружений для Python","breaks":false,"slideOptions":"{\"theme\":\"white\",\"transition\":\"slide\"}","contributors":"[{\"id\":\"e0bc91de-98f7-46f8-a3a9-852912833a93\",\"add\":93,\"del\":73},{\"id\":\"38b0f324-6648-4b08-b1c3-8bc762b8ab7b\",\"add\":12020,\"del\":10306}]"}