(рабочая группа отвечающая за скоуп задач по менеджменту пакетов) (pip, setuptools, pipenv, twine и тд) https://github.com/pypa Полный список терминов касающихся Python-пакетов https://packaging.python.org/glossary/#term-distribution-package
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 .. с чего всё начиналось ещё в разработке
python code for i in range(3): print(f"Hooray {i}!") execute in REPL Набор синтаксических конструкций и символов, корректно интерпретируемых и исполняемых интерпретатором CPython python code размещенный в файле ‘.py’ расширения только файлы с .py расширением являются модулями по терминологии PyPa
пытаться отрабатывать файлы с любыми расширениями .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')
repo unittests 1 2 1 1 2 Таги, хуки, запуски тестов на PR и т.д. - не скоуп этого доклада Тесты при TDD могут быть раньше кода, но шаг с тестами в реалиях может вообще отсутствовать. Давайте честно. запускаю тесты деплою на прод установить как зависимость установить как скрипт распаковать нужно воспроизводить окружение и зависимости проекта
code github repo unittests запускаю тесты деплою на прод установить как зависимость установить как скрипт распаковать нужно воспроизводить окружение и зависимости проекта github repo git clone как это запустить? А что ЗА у нас на проде? А вы точно тесты запускали? А нам нужны e2e тесты деплою на стейдж Верните как было!
- Версионировать релизы/код - Воспроизводить окружение проекта (устанавливать зависимости, конфиги и т.д) - Публиковать свой код в репозиторий (Package Index) - а ещё документацию - но это за рамками доклада - и желательно всё это кастомизировать (обязательно строим свои уникальные велосипеды)
из 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 …’ оптимизации и детали - за скоупом доклада
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. Свои переменные окружения
по умолчанию) $ pip install .. в виртуальном окружении всегда в lib/python$version/site-packages установку можно кастомизировать, используя pip install --user pip install- -target
установить как скрипт распаковать ../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
окружение (virtualenv) 2) обмен переменными окружения и настройками между различными (virtualenv) 3) pyc/pyo файлы 4) пространство имен в PYTHONPATH - что первое найдется, то и модуль 5) помним про возможности добавления расширения .pth/export/sys (вдруг кто-то в рантайме переписал вам pythonpath, а вы не понимаете почему импортируется не то что казалось бы должно ;)) 6) а ещё у нас есть entry_points
(tox.ini) - Setuptools (внутри distutils и easy_install) (иногда патчи над ним - кастомные или Pbr) - Setup.cfg (нужен в связке с setuptools) - requirements.txt для pip - MANIFEST.ini - bumpversion или другая альтернатива - а ещё twine чтобы релизить на PyPI - 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 )
всё это можно патчить, кастомизировать, писать свои команды и тд - Смотреть детально загрузку модулей и пакетов, плагины, как создавать версии пакетов для разных интерпретаторов - Настраивать CI/CD пайплайны, делать интеграции с гитхуками и многое другое