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

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

  • 1.
    PYENV И PUNDLE Альтернативныйвзгляд на работу с зависимостями
  • 2.
    PYENV • большой наборверсий python • автоматически переключает версию, файл .pyenv-version • девственный site-packages • но с самым важным внутри
  • 4.
  • 5.
    • virtualenv venv •venv/bin/pip install -r requirements.txt • venv/bin/python manage.py run
  • 8.
    REQUIREMENTS.TXT • Flask >0.10 • Какая версия будет в итоге? • Если прописать Flask == 0.10, какая версия Werkzeug будет в итоге? • pip freeze бесполезен
  • 9.
    PIP-TOOLS • pip-compile, веткаfuture • requirements.in только нужные пакеты • requirements.txt с замороженными зависимостями • http://nvie.com/posts/better-package-management/
  • 10.
    ПРОБЛЕМЫVIRTUALENV • нет возможностибыстро переключать версии пакетов • нет простого метода заморозить версии • много возни ручками при разных версиях пакетов в разных ветках • иногда ломается и требует пересборки
  • 11.
    А ЧТО СОБСТВЕННО ДЕЛАЕТVIRTUALENV? •Если откинуть в сторону все пляски с созданием магической папки, то в чем соль? • Мы закидываем пакеты в отдельную папку и импортируем их оттуда • Каждый проект содержит все пакеты • Они дублируются • Их надо ставить отдельно в каждую папку • Есть много решений как ставить их быстро!
  • 12.
    ВСЁ РЕШАЕМО! pip wheel- действительно ускоряет, но решает немного не ту проблему.
  • 13.
    КАК МОЖНО РЕШИТЬ ИНАЧЕ? •можно ставить пакеты в индивидуальные папки, по версиям пакетов и по версиям интерпретаторов • при старте читаем frozen.txt и монтируем нужные версии пакетов
  • 14.
    НУЖНО УПРАВЛЯТЬ ВЕРСИЯМИ • читаемrequirements.txt, frozen.txt • если какие-то зависимости отсутствуют во frozen.txt, вытягиваем максимальную удовлетворяющую версию и замораживаем
  • 15.
    PUNDLE • управляет версиями •пакеты лежат в ~/.pundledir • монтируются при старте import pundle; pundle.activate() • ругается, если frozen.txt неактуален
  • 16.
  • 17.
    СЛУЧАЙ WERKZEUG • Pundleнадо запуститься перед загрузкой всего остального кода, например через ‘-c “import pundle; pundle.activate(); exec(open(‘script’).read())” • автоматический рестарт. Внутри магия, которая пытается воссоздать командную строку • python не позволяет достать аргументы к “-c” и прячет их из sys.argv. Да и вообще стирает на уровне C из orig_argv (ещё раз - orig_argv, orig, именно, argv). • можно обойти через usercustomize.py или правкой стартового скрипта
  • 18.
    .PTH INSANITY • Самыйчастый случай использования это выполнить что-то при старте интерпретатора • Класть надо в site-packages • Нет стандартного механизма • Часто используют не в разумных целях
  • 19.
    SUPERVISOR.RUN • import subprocess;import run; subprocess.run = run.run;
  • 21.
    ПРОБУЕМ • берем проектс 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