21
PYENV И PUNDLE Альтернативный взгляд на работу с зависимостями

Pundle для менджемента зависимостей в python проектах

  • Upload
    -

  • View
    356

  • Download
    1

Embed Size (px)

Citation preview

PYENV И PUNDLEАльтернативный взгляд на работу с зависимостями

PYENV

• большой набор версий python

• автоматически переключает версию, файл .pyenv-version

• девственный site-packages

• но с самым важным внутри

ПРОБЛЕМЫ МЕНЕДЖМЕНТА ЗАВИСИМОСТЕЙ

• virtualenv venv

• venv/bin/pip install -r requirements.txt

• venv/bin/python manage.py run

REQUIREMENTS.TXT

• Flask > 0.10

• Какая версия будет в итоге?

• Если прописать Flask == 0.10, какая версия Werkzeug будет в итоге?

• pip freeze бесполезен

PIP-TOOLS

• pip-compile, ветка future

• requirements.in только нужные пакеты

• requirements.txt с замороженными зависимостями

• http://nvie.com/posts/better-package-management/

ПРОБЛЕМЫ VIRTUALENV• нет возможности быстро переключать версии пакетов

• нет простого метода заморозить версии

• много возни ручками при разных версиях пакетов в разных ветках

• иногда ломается и требует пересборки

А ЧТО СОБСТВЕННО ДЕЛАЕТ VIRTUALENV?

• Если откинуть в сторону все пляски с созданием магической папки, то в чем соль?

• Мы закидываем пакеты в отдельную папку и импортируем их оттуда

• Каждый проект содержит все пакеты

• Они дублируются

• Их надо ставить отдельно в каждую папку

• Есть много решений как ставить их быстро!

ВСЁ РЕШАЕМО!pip wheel - действительно ускоряет, но решает

немного не ту проблему.

КАК МОЖНО РЕШИТЬ ИНАЧЕ?

• можно ставить пакеты в индивидуальные папки, по версиям пакетов и по версиям интерпретаторов

• при старте читаем frozen.txt и монтируем нужные версии пакетов

НУЖНО УПРАВЛЯТЬ ВЕРСИЯМИ

• читаем requirements.txt, frozen.txt

• если какие-то зависимости отсутствуют во frozen.txt, вытягиваем максимальную удовлетворяющую версию и замораживаем

PUNDLE

• управляет версиями

• пакеты лежат в ~/.pundledir

• монтируются при старте import pundle; pundle.activate()

• ругается, если frozen.txt неактуален

ПРОБЛЕМЫ ПОДХОДАВсё решаемо конечно

СЛУЧАЙ WERKZEUG• Pundle надо запуститься перед загрузкой всего остального кода, например через ‘-c “import pundle; pundle.activate(); exec(open(‘script’).read())”

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

• python не позволяет достать аргументы к “-c” и прячет их из sys.argv. Да и вообще стирает на уровне C из orig_argv (ещё раз - orig_argv, orig, именно, argv).

• можно обойти через usercustomize.py или правкой стартового скрипта

.PTH INSANITY

• Самый частый случай использования это выполнить что-то при старте интерпретатора

• Класть надо в site-packages

• Нет стандартного механизма

• Часто используют не в разумных целях

SUPERVISOR.RUN

• import subprocess; import run; subprocess.run = run.run;

ПРОБУЕМ• берем проект с requirements.txt

• pyenv shell 3.4.1

• pip install pundle

• python -m pundle install

• python -m pundle run script.py

• python -m pundle exec pyflakes