Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Максим Безруков (VK, senior developer). Виртуал...

Максим Безруков (VK, senior developer). Виртуальное окружение по хардкору. Жизнь без pip — бывает и такое.

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

Никакого pip, poetry и пр. Как же сделать коробочку со всем необходимым (python, библиотеки и прочие зависимости и запустить сервис в systemd прямо из неё. Только pyenv, virtualenv и bash.

Видео: https://moscowpython.ru/meetup/82/virtual-env/

Moscow Python: http://moscowpython.ru
Курсы Learn Python: http://learn.python.ru
Moscow Python Podcast: http://podcast.python.ru
Заявки на доклады: https://bit.ly/mp-speaker

Moscow Python Meetup

July 04, 2023
Tweet

More Decks by Moscow Python Meetup

Other Decks in Programming

Transcript

  1. [TOC] *table of content 3 1. Зачем вообще это всё?

    2. Немного истории 3. Про pip 4. Полепим, поварим 5. Cделаем выводы
  2. За что нам всё это? 4 pip опасен? Но почему?

    - подделка РЕЙТИНГА ПРОЕКТОВ. - опасность вредоносное ПО для бэкдора. - не всё есть в официальном PyPI репозитории - бывает, что пропадает какой-нибудь codecov - мы не читаем deprecation warning :(
  3. Хотелось бы всего и сразу - хочется ставить всё только

    через пакетный менеджер и репозитории OC - хочется просто жить на systemd сервисах в сервере не используя докер и др. - хочется чтобы мейнтейнеры, когда пакет убирают.. всё дальше работало - хочется чтобы как с докером и pip, но без pip и докера - хочется замороженные во льдах все зависимости и чтоб легко поддерживать - хочется чтобы Армин Ронахер и написал какой-нибудь новый “rye” для этого всего 5
  4. 6

  5. 7

  6. Немного истории 8 Хотел рассказать про историю от пустоты 1998

    сквозь нормальный pip в 2012 и до наших дней с крутыми pipenv/poetry и hatch НО ВСЁ УЖЕ ЕСТЬ. Григорий Петров / Управление зависимостями в Python https://youtu.be/fP8oGx6ZA5o Очень рекоменду посмотреть.
  7. Что же не так с pip и pypi 9 -

    нет аудита (хотя можно позаботиться самим) - опять новость, что на pypi попали еще N пакетов с названиями, похожими на известные библиотеки и злобным кодом внутри. (и да это работает) - действительно не все пакеты есть в pypi репах - pip и системные зависимости - нет изоляции самой по себе (ну и ладно, есть же venv)
  8. Pip и системные штуки 10 На данный момент, Python Enhancement

    Proposals фокусируются на зависимостях Python- пакетов между собой, а не от системных пакетов. Ибо цель портативность между различными системами и окружениями. - psycopg2, надо системные штуки - lxml, потребует libxml2 и libxslt - samba или ldb (тащат кучу всякого) - in-house developed libraries (тут вообще страшно) - и др. В большинстве случаем pip выдаст качественную ошибку. ЕСЛИ ПОВЕЗЕТ :) Да-да-да docker шикарное решение этих проблем, но мы тут пытаемся выживать вообще-то.
  9. 11 It’s okey *да так и должно быть pip вообще

    не для этого. И проблемы ли это вообще?
  10. Варианты вариант 1 - уволиться и забугры (не рассматриваем, мы

    ведь не бежим от проблем) вариант 2 - свой репозиторий с пакетами под проект, свой pypi с аудитом (затратно выходит, но вдруг?) вариант 3 - переубедить начальство и использовать уже pip и docker вариант 4 - слепить из того, что есть вариант X - нанять Армина Ронахера (он всё напишет, лучше чем best-practice) 12
  11. Немного фактов и ингредиентов. • варить будем всё в linux

    • допустим нам повезло и мы знаем, OC и архитектуру (это успех) • кроссплатформенность (это боль в такой ситуации) • virtualenv(venv) это не докер (нет тут никакой системной изоляции и не должно) • pyenv != pip (pyenv явно подойдет лучше, чем conda) • без использования Docker или аналогичных технологий, создание полностью изолированного окружения в Python, включая системные штуки - явно сложно. • Conda, просто - нет • venv в python или python в vevn..? • а как вообще поставить пакет в оружение, если пакетный менеджер работает с системой? 14
  12. Python first 15 Оно скомпилируется на 200+mb много всякого можно

    убрать. (но сильно уменьшить не выйдет) Можно и с pyenv (но с оговорками) --может не быть (да такое бывает) --shims
  13. Cook vevn питон в окружение или окружение в питон?) 16

    Будет работать. пока не трогаем.. (но это не то)
  14. Разбираемся с activate 18 # starting from approximately line 40

    LD_LIBRARY_PATH — это переменная окружения в Unix-подобных операционных системах (Linux / macOS). Нужна компоновщику динамической библиотеки (dynamic linker), чтобы указать, где искать динамические библиотеки для загрузки. Та самая error while loading shared libraries
  15. 19

  16. Пакеты 20 • используем пакетный менеджер(dnf, yum, pacman …) •

    смотрим зависимости • python пакеты обычно с префиксом НО НЕ ВСЕГДА! python3-name • переносим в окружение нагло или деликатно • не забываем системные штуки
  17. Проверяем Кидаем куда-нибудь нашу frankenstein коробку (С ТОЙ ЖЕ СИСТЕМОЙ

    И АРХИТЕКТУРОЙ) Конечно - используем git можно в systemd сервис (например запустить нашу django): запускаем - работает. print(“Поздравляю - вы совершили самое настоящее надругательство над venv”) 23
  18. 25 Выводы 1 • язык != решатель зависимостей != изоляция

    (Да, бывают исключения вроде cargo rust. Для всего есть свой инструмент) • минусов больше плюсов (даже если есть скрипты чтобы не копировать руками) • под каждую архитектуру собирать такое отдельно • коробку такую можно хранить вообще отдельно от проекта • больше контроля над неизвестными зависимостями Всё это точно НЕ best practice и вообще антипаттерн.
  19. 26 Выводы 2 pyup.io/safety/ NOT FREE it has a user

    friendly output table or JSON Docker image is available; full reports are available. Даже CI есть github.com/pypa/pip-audit Apache 2.0 license; output table or JSON; and it is easy to implement https://realpython.com/python-package-quality/ катастрофизация ошибка атрибуции антипаттерн используйте pip (просто делайте это правильно) Аудит кода обойдется дешевле. Можно дойти и до виртуального окружения по SSH PEP 517 tool PEP 518 dependencies PEP 621 meta