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

Talk about state of Python Packaging Lifecycle in 2019

Talk about state of Python Packaging Lifecycle in 2019

Internal talk in Grid Dynamics about Python Packaging Lifecycle and small overview of existed tools.

Iuliia Volkova

November 20, 2019
Tweet

More Decks by Iuliia Volkova

Other Decks in Programming

Transcript

  1. 1 Privileged and confidential Управление пакетами в Python слайды могут

    не соответстветствовать корпоративным стандартам
  2. 2 Privileged and confidential PyPa Python Packaging Authority - https://www.pypa.io/en/latest/

    (рабочая группа отвечающая за скоуп задач по менеджменту пакетов) (pip, setuptools, pipenv, twine и тд) https://github.com/pypa Полный список терминов касающихся Python-пакетов https://packaging.python.org/glossary/#term-distribution-package
  3. 3 Privileged and confidential PEP420 https://www.python.org/dev/peps/pep-0420/ (19-Apr-2012): Implicit Namespace Packages

    PEP440 https://www.python.org/dev/peps/pep-0440/ (22 Aug 2014): Version Identification ... PEP427 https://www.python.org/dev/peps/pep-0427/ (15-Feb-2013): The Wheel Binary ... PEP518 https://www.python.org/dev/peps/pep-0518/ (13-May-2016): Specifying Minimum Build ... PEP517 https://www.python.org/dev/peps/pep-0517/ (11 Sep 2017): A build-system independent format .. PEPs (Python Enhancement Proposal) PEP 229 https://www.python.org/dev/peps/pep-0229/ (16-Nov-2000): Using Distutils to Build Python PEP 508 https://www.python.org/dev/peps/pep-0229/ (16-Nov-2015): Dependency specification for Python .. с чего всё начиналось ещё в разработке
  4. 4 Privileged and confidential Базовая терминология .py module (Pure Module)

    python code for i in range(3): print(f"Hooray {i}!") execute in REPL Набор синтаксических конструкций и символов, корректно интерпретируемых и исполняемых интерпретатором CPython python code размещенный в файле ‘.py’ расширения только файлы с .py расширением являются модулями по терминологии PyPa
  5. 5 Privileged and confidential НЛО: Про расширения файлов Интерпретатор будет

    пытаться отрабатывать файлы с любыми расширениями .pyc - компилированный в bytecode модуль (для ускорения дальнейшего переиспользования) .pyo - скомпилированнный с оптимизациями bytecode (-0 и -00 флаги) Не забываем убирать __pycache__, .pyc, .pyo файлы из дистрибуций, не коммитим в .git Python bytecode архитектурно независимый, но зависим на версию Python VM (Bad magic number error ). import imp imp.get_magic().encode('hex')
  6. 6 Privileged and confidential Базовая терминология Package (Import Package) Директория,

    содержащая в себе __init__.py (достаточно пустого файла) Sub package
  7. 9 Privileged and confidential Терминология py code py code py

    code py code Module Module Module py code ... sub package sub package ... ... package Distribution Package package ... ...
  8. 10 Privileged and confidential Терминология Package Index https://pypi.org/ Per Project

    Index pypiserver 1.3.1 Local usage (in project/company): много имплементаций, есть в Sonatype Nexus 3, JFrog и тд
  9. 11 Privileged and confidential Жизненный цикл: начало .py code github

    repo unittests 1 2 1 1 2 Таги, хуки, запуски тестов на PR и т.д. - не скоуп этого доклада Тесты при TDD могут быть раньше кода, но шаг с тестами в реалиях может вообще отсутствовать. Давайте честно. запускаю тесты деплою на прод установить как зависимость установить как скрипт распаковать нужно воспроизводить окружение и зависимости проекта
  10. 12 Privileged and confidential Жизненный цикл: появились ещё разработчики .py

    code github repo unittests запускаю тесты деплою на прод установить как зависимость установить как скрипт распаковать нужно воспроизводить окружение и зависимости проекта github repo git clone как это запустить? А что ЗА у нас на проде? А вы точно тесты запускали? А нам нужны e2e тесты деплою на стейдж Верните как было!
  11. 13 Privileged and confidential В итоге нужно: - Запускать тесты

    - Версионировать релизы/код - Воспроизводить окружение проекта (устанавливать зависимости, конфиги и т.д) - Публиковать свой код в репозиторий (Package Index) - а ещё документацию - но это за рамками доклада - и желательно всё это кастомизировать (обязательно строим свои уникальные велосипеды)
  12. 15 Privileged and confidential PYTHONPATH import sys print(sys.path) # Запуск

    из PyCharm (run) смотрим на влияние среды запуска на контент [ /Users/jvolkova/laziest/laziest /Users/jvolkova/laziest /Applications/PyCharm.app/Contents/helpers/pycharm_display /usr/local/Cellar/python/3.7.4_1/Frameworks/Python.framework/Versions/3.7/lib/python37.zip …. /Applications/PyCharm.app/Contents/helpers/pycharm_matplotlib_backend ] # Cpython просто идет по директориям и ищет пэкадж который вы импортируете с ‘from …’ оптимизации и детали - за скоупом доклада
  13. 16 Privileged and confidential PYTHONPATH import sys print(sys.path) # Запуск

    из консоли (тот же интерпретатор, тот же скрипт)
  14. 19 Privileged and confidential virtual environments https://github.com/pypa/virtualenv python3 venv pyenv

    source is a bash shell built-in command that executes the content of the file passed as argument Никакой магии при активации source ./venv/bin/activate детальный разбор - за скоупом Основные моменты: 1. Изолированная копия интерпретатора 2. Изолированный спейс пакетов(lib) и скриптов (bin) 3. Свои переменные окружения
  15. 20 Privileged and confidential lib/python$version/site-packages Тут живут библиотеки (при установки

    по умолчанию) $ pip install .. в виртуальном окружении всегда в lib/python$version/site-packages установку можно кастомизировать, используя pip install --user pip install- -target
  16. 21 Privileged and confidential Глобальные site-packages Немного сложнее - пути

    могут скакать от ОС, версии и тд Как найти глобальный site-packages: python3.7 -c "import site; print(site.getsitepackages())"
  17. 23 Privileged and confidential + как добавлять в PYTHONPATH стандартные:

    (из sh) export PYTHONPATH=$PYTHONPATH:/your/amazing/path (из python) import sys sys.path.append('/magic/path')
  18. 25 Privileged and confidential Типы установок установить как зависимость (lib)

    установить как скрипт распаковать ../pwd /package_dir __init__.py pymodule.py python package_dir/pymodule.py (или спец кейсы - DAGs Airflow) /bin entrypoint console_scripts pip install .. site-packages ../pwd must be in PYTHONPATH $ mysupernewcli do_something_amazing from my_new_package import something
  19. 26 Privileged and confidential Помним про 1) глобальный или изолированное

    окружение (virtualenv) 2) обмен переменными окружения и настройками между различными (virtualenv) 3) pyc/pyo файлы 4) пространство имен в PYTHONPATH - что первое найдется, то и модуль 5) помним про возможности добавления расширения .pth/export/sys (вдруг кто-то в рантайме переписал вам pythonpath, а вы не понимаете почему импортируется не то что казалось бы должно ;)) 6) а ещё у нас есть entry_points
  20. 29 Privileged and confidential Как это было раньше - Tox

    (tox.ini) - Setuptools (внутри distutils и easy_install) (иногда патчи над ним - кастомные или Pbr) - Setup.cfg (нужен в связке с setuptools) - requirements.txt для pip - MANIFEST.ini - bumpversion или другая альтернатива - а ещё twine чтобы релизить на PyPI - pip для установки пакетов
  21. 30 Privileged and confidential Timeline easy_ install distutils setuptools setup.cfg

    New in 30.3.0 (8 Dec 2016) !!! pyproject.toml pip 0.6b1 PRE-RELEASE May 13, 2006 pipenv poetry 10 лет!!! 4 April 2011
  22. 33 Privileged and confidential Настраиваем свой PyPi сервер 1. pip

    install pypiserver 2. mkdir ~/packages 3. pip install passlib # apache htpasswd 4. htpasswd -sc .htaccess me 5. pypi-server -p 8000 ~/packages & # (по умолчанию порт 8080, но у меня там живёт Airflow) pip install --extra-index-url http://localhost:8000/simple/ помимо использования через cli можно прописывать в .pip.conf (https://pip.pypa.io/en/stable/user_guide/#configuration )
  23. 34 Privileged and confidential Дисклеймер Я буду использовать Poetry, но

    есть другие Pipenv DepHell Hatch Pipfile and Pipfile.lock всё ещё setup.py
  24. 39 Privileged and confidential dynamically versions from git/svn/etc. tags pip

    install poetry-dynamic-versioning # in global scope, same way as poetry installed
  25. 40 Privileged and confidential poetry config Добавим наш Per Project

    Index poetry config repositories.local http://localhost:8080/simple Возможно вы хотите логин/пароль poetry config http-basic.local username password можете с помощью переменных окружения export POETRY_PYPI_TOKEN_PYPI=my-token export POETRY_HTTP_BASIC_PYPI_USERNAME=username export POETRY_HTTP_BASIC_PYPI_PASSWORD=password Поддержка TLS есть. Полная дока тут: https://github.com/sdispater/poetry/blob/master/d ocs/docs/repositories.md Публикация пакета на PyPi !!!
  26. 43 Privileged and confidential tox https://tox.readthedocs.io/en/latest/example/ba sic.html#pyproject-toml-tox-legacy-ini Currently only the

    old format is supported via legacy_tox_ini, a native implementation is planned though. [tool.tox] legacy_tox_ini = """ [tox] envlist = py37 """
  27. 45 Privileged and confidential А что ещё? - А ещё

    всё это можно патчить, кастомизировать, писать свои команды и тд - Смотреть детально загрузку модулей и пакетов, плагины, как создавать версии пакетов для разных интерпретаторов - Настраивать CI/CD пайплайны, делать интеграции с гитхуками и многое другое