practical python packaging / Стас Рудаков / web developer wargaming

50
Practical Python Packaging История Пакетирование setuptools pbr Разработка Приятные мелочи pkg_resources Entry points Console scripts Plug-ins Extras Проблемы Собираем все воедино Practical Python Packaging Stas Rudakou [email protected] Minsk Python Meetup November 2014

Upload: python-meetup

Post on 08-Jul-2015

727 views

Category:

Software


2 download

DESCRIPTION

Распространено мнение, что навык пакетирования своих наработок необходим только гуру в Open Source. Стас развенчал этот миф и показал несколько практических задач, решаемых при помощи пакетирования кода.

TRANSCRIPT

Page 1: Practical Python Packaging / Стас Рудаков / Web Developer Wargaming

PracticalPython

Packaging

История

ПакетированиеsetuptoolspbrРазработка

Приятныемелочиpkg_resourcesEntry pointsConsole scriptsPlug-insExtras

Проблемы

Собираем всевоедино

Practical Python Packaging

Stas [email protected]

Minsk Python MeetupNovember 2014

Page 2: Practical Python Packaging / Стас Рудаков / Web Developer Wargaming

PracticalPython

Packaging

История

ПакетированиеsetuptoolspbrРазработка

Приятныемелочиpkg_resourcesEntry pointsConsole scriptsPlug-insExtras

Проблемы

Собираем всевоедино

История

Page 3: Practical Python Packaging / Стас Рудаков / Web Developer Wargaming

PracticalPython

Packaging

История

ПакетированиеsetuptoolspbrРазработка

Приятныемелочиpkg_resourcesEntry pointsConsole scriptsPlug-insExtras

Проблемы

Собираем всевоедино

История

2000 • distutils вошел в стандартную библиотеку Python 1.6

2003 • запущен PyPI2004 • выпуск setuptools (easy_install, формат egg)2006 • выпуск buildout2007 • выпуск virtualenv2008 • выпуск pip2008 • distribute — форк setuptools2012 • distutils2/packaging не вошел в Python 3.32012 • venv включен в стандартную библиотеку Python 3.32012 • дистрибутив Anaconda, пакетный менеджер conda2013 • объединение проектов distribute и setuptools2013 • pip и easy_install начинают использовать SSL2013 • формат Wheel2014 • в Python 3.4 вошли скрипты для установки pip

Page 4: Practical Python Packaging / Стас Рудаков / Web Developer Wargaming

PracticalPython

Packaging

История

ПакетированиеsetuptoolspbrРазработка

Приятныемелочиpkg_resourcesEntry pointsConsole scriptsPlug-insExtras

Проблемы

Собираем всевоедино

История

2000 • distutils вошел в стандартную библиотеку Python 1.62003 • запущен PyPI

2004 • выпуск setuptools (easy_install, формат egg)2006 • выпуск buildout2007 • выпуск virtualenv2008 • выпуск pip2008 • distribute — форк setuptools2012 • distutils2/packaging не вошел в Python 3.32012 • venv включен в стандартную библиотеку Python 3.32012 • дистрибутив Anaconda, пакетный менеджер conda2013 • объединение проектов distribute и setuptools2013 • pip и easy_install начинают использовать SSL2013 • формат Wheel2014 • в Python 3.4 вошли скрипты для установки pip

Page 5: Practical Python Packaging / Стас Рудаков / Web Developer Wargaming

PracticalPython

Packaging

История

ПакетированиеsetuptoolspbrРазработка

Приятныемелочиpkg_resourcesEntry pointsConsole scriptsPlug-insExtras

Проблемы

Собираем всевоедино

История

2000 • distutils вошел в стандартную библиотеку Python 1.62003 • запущен PyPI2004 • выпуск setuptools (easy_install, формат egg)

2006 • выпуск buildout2007 • выпуск virtualenv2008 • выпуск pip2008 • distribute — форк setuptools2012 • distutils2/packaging не вошел в Python 3.32012 • venv включен в стандартную библиотеку Python 3.32012 • дистрибутив Anaconda, пакетный менеджер conda2013 • объединение проектов distribute и setuptools2013 • pip и easy_install начинают использовать SSL2013 • формат Wheel2014 • в Python 3.4 вошли скрипты для установки pip

Page 6: Practical Python Packaging / Стас Рудаков / Web Developer Wargaming

PracticalPython

Packaging

История

ПакетированиеsetuptoolspbrРазработка

Приятныемелочиpkg_resourcesEntry pointsConsole scriptsPlug-insExtras

Проблемы

Собираем всевоедино

История

2000 • distutils вошел в стандартную библиотеку Python 1.62003 • запущен PyPI2004 • выпуск setuptools (easy_install, формат egg)2006 • выпуск buildout

2007 • выпуск virtualenv2008 • выпуск pip2008 • distribute — форк setuptools2012 • distutils2/packaging не вошел в Python 3.32012 • venv включен в стандартную библиотеку Python 3.32012 • дистрибутив Anaconda, пакетный менеджер conda2013 • объединение проектов distribute и setuptools2013 • pip и easy_install начинают использовать SSL2013 • формат Wheel2014 • в Python 3.4 вошли скрипты для установки pip

Page 7: Practical Python Packaging / Стас Рудаков / Web Developer Wargaming

PracticalPython

Packaging

История

ПакетированиеsetuptoolspbrРазработка

Приятныемелочиpkg_resourcesEntry pointsConsole scriptsPlug-insExtras

Проблемы

Собираем всевоедино

История

2000 • distutils вошел в стандартную библиотеку Python 1.62003 • запущен PyPI2004 • выпуск setuptools (easy_install, формат egg)2006 • выпуск buildout2007 • выпуск virtualenv

2008 • выпуск pip2008 • distribute — форк setuptools2012 • distutils2/packaging не вошел в Python 3.32012 • venv включен в стандартную библиотеку Python 3.32012 • дистрибутив Anaconda, пакетный менеджер conda2013 • объединение проектов distribute и setuptools2013 • pip и easy_install начинают использовать SSL2013 • формат Wheel2014 • в Python 3.4 вошли скрипты для установки pip

Page 8: Practical Python Packaging / Стас Рудаков / Web Developer Wargaming

PracticalPython

Packaging

История

ПакетированиеsetuptoolspbrРазработка

Приятныемелочиpkg_resourcesEntry pointsConsole scriptsPlug-insExtras

Проблемы

Собираем всевоедино

История

2000 • distutils вошел в стандартную библиотеку Python 1.62003 • запущен PyPI2004 • выпуск setuptools (easy_install, формат egg)2006 • выпуск buildout2007 • выпуск virtualenv2008 • выпуск pip

2008 • distribute — форк setuptools2012 • distutils2/packaging не вошел в Python 3.32012 • venv включен в стандартную библиотеку Python 3.32012 • дистрибутив Anaconda, пакетный менеджер conda2013 • объединение проектов distribute и setuptools2013 • pip и easy_install начинают использовать SSL2013 • формат Wheel2014 • в Python 3.4 вошли скрипты для установки pip

Page 9: Practical Python Packaging / Стас Рудаков / Web Developer Wargaming

PracticalPython

Packaging

История

ПакетированиеsetuptoolspbrРазработка

Приятныемелочиpkg_resourcesEntry pointsConsole scriptsPlug-insExtras

Проблемы

Собираем всевоедино

История

2000 • distutils вошел в стандартную библиотеку Python 1.62003 • запущен PyPI2004 • выпуск setuptools (easy_install, формат egg)2006 • выпуск buildout2007 • выпуск virtualenv2008 • выпуск pip2008 • distribute — форк setuptools

2012 • distutils2/packaging не вошел в Python 3.32012 • venv включен в стандартную библиотеку Python 3.32012 • дистрибутив Anaconda, пакетный менеджер conda2013 • объединение проектов distribute и setuptools2013 • pip и easy_install начинают использовать SSL2013 • формат Wheel2014 • в Python 3.4 вошли скрипты для установки pip

Page 10: Practical Python Packaging / Стас Рудаков / Web Developer Wargaming

PracticalPython

Packaging

История

ПакетированиеsetuptoolspbrРазработка

Приятныемелочиpkg_resourcesEntry pointsConsole scriptsPlug-insExtras

Проблемы

Собираем всевоедино

История

2000 • distutils вошел в стандартную библиотеку Python 1.62003 • запущен PyPI2004 • выпуск setuptools (easy_install, формат egg)2006 • выпуск buildout2007 • выпуск virtualenv2008 • выпуск pip2008 • distribute — форк setuptools2012 • distutils2/packaging не вошел в Python 3.3

2012 • venv включен в стандартную библиотеку Python 3.32012 • дистрибутив Anaconda, пакетный менеджер conda2013 • объединение проектов distribute и setuptools2013 • pip и easy_install начинают использовать SSL2013 • формат Wheel2014 • в Python 3.4 вошли скрипты для установки pip

Page 11: Practical Python Packaging / Стас Рудаков / Web Developer Wargaming

PracticalPython

Packaging

История

ПакетированиеsetuptoolspbrРазработка

Приятныемелочиpkg_resourcesEntry pointsConsole scriptsPlug-insExtras

Проблемы

Собираем всевоедино

История

2000 • distutils вошел в стандартную библиотеку Python 1.62003 • запущен PyPI2004 • выпуск setuptools (easy_install, формат egg)2006 • выпуск buildout2007 • выпуск virtualenv2008 • выпуск pip2008 • distribute — форк setuptools2012 • distutils2/packaging не вошел в Python 3.32012 • venv включен в стандартную библиотеку Python 3.3

2012 • дистрибутив Anaconda, пакетный менеджер conda2013 • объединение проектов distribute и setuptools2013 • pip и easy_install начинают использовать SSL2013 • формат Wheel2014 • в Python 3.4 вошли скрипты для установки pip

Page 12: Practical Python Packaging / Стас Рудаков / Web Developer Wargaming

PracticalPython

Packaging

История

ПакетированиеsetuptoolspbrРазработка

Приятныемелочиpkg_resourcesEntry pointsConsole scriptsPlug-insExtras

Проблемы

Собираем всевоедино

История

2000 • distutils вошел в стандартную библиотеку Python 1.62003 • запущен PyPI2004 • выпуск setuptools (easy_install, формат egg)2006 • выпуск buildout2007 • выпуск virtualenv2008 • выпуск pip2008 • distribute — форк setuptools2012 • distutils2/packaging не вошел в Python 3.32012 • venv включен в стандартную библиотеку Python 3.32012 • дистрибутив Anaconda, пакетный менеджер conda

2013 • объединение проектов distribute и setuptools2013 • pip и easy_install начинают использовать SSL2013 • формат Wheel2014 • в Python 3.4 вошли скрипты для установки pip

Page 13: Practical Python Packaging / Стас Рудаков / Web Developer Wargaming

PracticalPython

Packaging

История

ПакетированиеsetuptoolspbrРазработка

Приятныемелочиpkg_resourcesEntry pointsConsole scriptsPlug-insExtras

Проблемы

Собираем всевоедино

История

2000 • distutils вошел в стандартную библиотеку Python 1.62003 • запущен PyPI2004 • выпуск setuptools (easy_install, формат egg)2006 • выпуск buildout2007 • выпуск virtualenv2008 • выпуск pip2008 • distribute — форк setuptools2012 • distutils2/packaging не вошел в Python 3.32012 • venv включен в стандартную библиотеку Python 3.32012 • дистрибутив Anaconda, пакетный менеджер conda2013 • объединение проектов distribute и setuptools

2013 • pip и easy_install начинают использовать SSL2013 • формат Wheel2014 • в Python 3.4 вошли скрипты для установки pip

Page 14: Practical Python Packaging / Стас Рудаков / Web Developer Wargaming

PracticalPython

Packaging

История

ПакетированиеsetuptoolspbrРазработка

Приятныемелочиpkg_resourcesEntry pointsConsole scriptsPlug-insExtras

Проблемы

Собираем всевоедино

История

2000 • distutils вошел в стандартную библиотеку Python 1.62003 • запущен PyPI2004 • выпуск setuptools (easy_install, формат egg)2006 • выпуск buildout2007 • выпуск virtualenv2008 • выпуск pip2008 • distribute — форк setuptools2012 • distutils2/packaging не вошел в Python 3.32012 • venv включен в стандартную библиотеку Python 3.32012 • дистрибутив Anaconda, пакетный менеджер conda2013 • объединение проектов distribute и setuptools2013 • pip и easy_install начинают использовать SSL

2013 • формат Wheel2014 • в Python 3.4 вошли скрипты для установки pip

Page 15: Practical Python Packaging / Стас Рудаков / Web Developer Wargaming

PracticalPython

Packaging

История

ПакетированиеsetuptoolspbrРазработка

Приятныемелочиpkg_resourcesEntry pointsConsole scriptsPlug-insExtras

Проблемы

Собираем всевоедино

История

2000 • distutils вошел в стандартную библиотеку Python 1.62003 • запущен PyPI2004 • выпуск setuptools (easy_install, формат egg)2006 • выпуск buildout2007 • выпуск virtualenv2008 • выпуск pip2008 • distribute — форк setuptools2012 • distutils2/packaging не вошел в Python 3.32012 • venv включен в стандартную библиотеку Python 3.32012 • дистрибутив Anaconda, пакетный менеджер conda2013 • объединение проектов distribute и setuptools2013 • pip и easy_install начинают использовать SSL2013 • формат Wheel

2014 • в Python 3.4 вошли скрипты для установки pip

Page 16: Practical Python Packaging / Стас Рудаков / Web Developer Wargaming

PracticalPython

Packaging

История

ПакетированиеsetuptoolspbrРазработка

Приятныемелочиpkg_resourcesEntry pointsConsole scriptsPlug-insExtras

Проблемы

Собираем всевоедино

История

2000 • distutils вошел в стандартную библиотеку Python 1.62003 • запущен PyPI2004 • выпуск setuptools (easy_install, формат egg)2006 • выпуск buildout2007 • выпуск virtualenv2008 • выпуск pip2008 • distribute — форк setuptools2012 • distutils2/packaging не вошел в Python 3.32012 • venv включен в стандартную библиотеку Python 3.32012 • дистрибутив Anaconda, пакетный менеджер conda2013 • объединение проектов distribute и setuptools2013 • pip и easy_install начинают использовать SSL2013 • формат Wheel2014 • в Python 3.4 вошли скрипты для установки pip

Page 17: Practical Python Packaging / Стас Рудаков / Web Developer Wargaming

PracticalPython

Packaging

История

ПакетированиеsetuptoolspbrРазработка

Приятныемелочиpkg_resourcesEntry pointsConsole scriptsPlug-insExtras

Проблемы

Собираем всевоедино

Пакетирование

Page 18: Practical Python Packaging / Стас Рудаков / Web Developer Wargaming

PracticalPython

Packaging

История

ПакетированиеsetuptoolspbrРазработка

Приятныемелочиpkg_resourcesEntry pointsConsole scriptsPlug-insExtras

Проблемы

Собираем всевоедино

Пакетирование

Как Dev я хочу:• думать, как писать программы и библиотеки• не думать, как распространять программы• использовать чужие наработки• делиться своими наработками

Как Ops я хочу:• легко ставить и сносить программы(при помощи pip)

• иметь свой PyPI-совместимый сервер

Page 19: Practical Python Packaging / Стас Рудаков / Web Developer Wargaming

PracticalPython

Packaging

История

ПакетированиеsetuptoolspbrРазработка

Приятныемелочиpkg_resourcesEntry pointsConsole scriptsPlug-insExtras

Проблемы

Собираем всевоедино

Пакетирование

Как Dev я хочу:• думать, как писать программы и библиотеки• не думать, как распространять программы• использовать чужие наработки• делиться своими наработками

Как Ops я хочу:• легко ставить и сносить программы(при помощи pip)

• иметь свой PyPI-совместимый сервер

Page 20: Practical Python Packaging / Стас Рудаков / Web Developer Wargaming

PracticalPython

Packaging

История

ПакетированиеsetuptoolspbrРазработка

Приятныемелочиpkg_resourcesEntry pointsConsole scriptsPlug-insExtras

Проблемы

Собираем всевоедино

setuptools

1 $ f i n d .2 .3 . / h e l l o4 . / h e l l o / data . j s o n5 . / h e l l o /__init__ . py6 . / h e l l o / wor ld . py

7 . / t e s t s /__init__ . py8 . / t e s t s / t e s t_h e l l o . py9

10 s e tup . py

Page 21: Practical Python Packaging / Стас Рудаков / Web Developer Wargaming

PracticalPython

Packaging

История

ПакетированиеsetuptoolspbrРазработка

Приятныемелочиpkg_resourcesEntry pointsConsole scriptsPlug-insExtras

Проблемы

Собираем всевоедино

setuptools

1 $ f i n d .2 .3 . / h e l l o4 . / h e l l o / data . j s o n5 . / h e l l o /__init__ . py6 . / h e l l o / wor ld . py7 . / t e s t s /__init__ . py8 . / t e s t s / t e s t_h e l l o . py

9

10 s e tup . py

Page 22: Practical Python Packaging / Стас Рудаков / Web Developer Wargaming

PracticalPython

Packaging

История

ПакетированиеsetuptoolspbrРазработка

Приятныемелочиpkg_resourcesEntry pointsConsole scriptsPlug-insExtras

Проблемы

Собираем всевоедино

setuptools

1 $ f i n d .2 .3 . / h e l l o4 . / h e l l o / data . j s o n5 . / h e l l o /__init__ . py6 . / h e l l o / wor ld . py7 . / t e s t s /__init__ . py8 . / t e s t s / t e s t_h e l l o . py9

10 s e tup . py

Page 23: Practical Python Packaging / Стас Рудаков / Web Developer Wargaming

PracticalPython

Packaging

История

ПакетированиеsetuptoolspbrРазработка

Приятныемелочиpkg_resourcesEntry pointsConsole scriptsPlug-insExtras

Проблемы

Собираем всевоедино

setuptools1 from s e t u p t o o l s impor t setup , f i nd_packages2 s e tup (3 name = " h e l l o −wor ld " ,4 v e r s i o n = " 0 .1 " ,5 packages = f ind_packages ( e x c l ud e =[" t e s t s " ] ) ,6

7 i n s t a l l _ r e q u i r e s = [ " d o c u t i l s >=0.3" ] ,8 package_data = {9 # I f any package c o n t a i n s ∗ . r s t f i l e s , i n c l u d e them

10 "" : [ " ∗ . r s t " ] ,11 # And i n c l u d e any ∗ . j s o n f i l e s found i n the " h e l l o " package12 " h e l l o " : [ " ∗ . j s o n " ] ,13 } ,14

15 autho r = " Stas Rudakou" ,16 author_emai l = " s ta s@ga rage22 . net " ,17 d e s c r i p t i o n = "This i s an Example Package" ,18 )

Page 24: Practical Python Packaging / Стас Рудаков / Web Developer Wargaming

PracticalPython

Packaging

История

ПакетированиеsetuptoolspbrРазработка

Приятныемелочиpkg_resourcesEntry pointsConsole scriptsPlug-insExtras

Проблемы

Собираем всевоедино

setuptools

1 $ python se tup . py i n s t a l l

2 $ python se tup . py s d i s t3 $ l s d i s t4 h e l l o −world −0.1 . t a r . gz

Page 25: Practical Python Packaging / Стас Рудаков / Web Developer Wargaming

PracticalPython

Packaging

История

ПакетированиеsetuptoolspbrРазработка

Приятныемелочиpkg_resourcesEntry pointsConsole scriptsPlug-insExtras

Проблемы

Собираем всевоедино

setuptools

1 $ python se tup . py i n s t a l l2 $ python se tup . py s d i s t3 $ l s d i s t4 h e l l o −world −0.1 . t a r . gz

Page 26: Practical Python Packaging / Стас Рудаков / Web Developer Wargaming

PracticalPython

Packaging

История

ПакетированиеsetuptoolspbrРазработка

Приятныемелочиpkg_resourcesEntry pointsConsole scriptsPlug-insExtras

Проблемы

Собираем всевоедино

setuptools

1 $ f i n d .2 .3 . / h e l l o4 . / h e l l o / data . j s o n5 . / h e l l o /__init__ . py6 . / h e l l o / wor ld . py7 . / t e s t s /__init__ . py8 . / t e s t s / t e s t_h e l l o . py9

10 s e tup . py11 s e tup . c f g12 README. r s t13 MANIFEST . i n

Page 27: Practical Python Packaging / Стас Рудаков / Web Developer Wargaming

PracticalPython

Packaging

История

ПакетированиеsetuptoolspbrРазработка

Приятныемелочиpkg_resourcesEntry pointsConsole scriptsPlug-insExtras

Проблемы

Собираем всевоедино

setuptools

1 impor t os . path2 from s e t u p t o o l s impor t setup , f i nd_packages3

4 t h i s_d i r = os . path . d i rname (__file__)5 with open ( os . path . j o i n ( t h i s_d i r , ’README. r s t ’ ) ) as f :6 README = f . r ead ( )7

8 s e tup (9 name = " h e l l o −wor ld " ,

10 v e r s i o n = " 0 .1 " ,11 # . . .12 l o n g_de s c r i p t i o n=README13 )

Page 28: Practical Python Packaging / Стас Рудаков / Web Developer Wargaming

PracticalPython

Packaging

История

ПакетированиеsetuptoolspbrРазработка

Приятныемелочиpkg_resourcesEntry pointsConsole scriptsPlug-insExtras

Проблемы

Собираем всевоедино

pbr

• pbr (Python Build Reasonableness) — это . . .• библиотека от разработчиков OpenStack . . .• для управления setuptools . . .

• с декларативной конфигурацией . . .• и версиями на основе ревизий и тегов в git

1 from s e t u p t o o l s impor t s e tup2

3 s e tup (4 s e t up_r equ i r e s =[ ’ pbr ’ ] ,5 pbr=True ,6 )

Page 29: Practical Python Packaging / Стас Рудаков / Web Developer Wargaming

PracticalPython

Packaging

История

ПакетированиеsetuptoolspbrРазработка

Приятныемелочиpkg_resourcesEntry pointsConsole scriptsPlug-insExtras

Проблемы

Собираем всевоедино

pbr

• pbr (Python Build Reasonableness) — это . . .• библиотека от разработчиков OpenStack . . .• для управления setuptools . . .• с декларативной конфигурацией . . .• и версиями на основе ревизий и тегов в git

1 from s e t u p t o o l s impor t s e tup2

3 s e tup (4 s e t up_r equ i r e s =[ ’ pbr ’ ] ,5 pbr=True ,6 )

Page 30: Practical Python Packaging / Стас Рудаков / Web Developer Wargaming

PracticalPython

Packaging

История

ПакетированиеsetuptoolspbrРазработка

Приятныемелочиpkg_resourcesEntry pointsConsole scriptsPlug-insExtras

Проблемы

Собираем всевоедино

pbr

• pbr (Python Build Reasonableness) — это . . .• библиотека от разработчиков OpenStack . . .• для управления setuptools . . .• с декларативной конфигурацией . . .• и версиями на основе ревизий и тегов в git

1 from s e t u p t o o l s impor t s e tup2

3 s e tup (4 s e t up_r equ i r e s =[ ’ pbr ’ ] ,5 pbr=True ,6 )

Page 31: Practical Python Packaging / Стас Рудаков / Web Developer Wargaming

PracticalPython

Packaging

История

ПакетированиеsetuptoolspbrРазработка

Приятныемелочиpkg_resourcesEntry pointsConsole scriptsPlug-insExtras

Проблемы

Собираем всевоедино

pbr

• pbr (Python Build Reasonableness) — это . . .• библиотека от разработчиков OpenStack . . .• для управления setuptools . . .• с декларативной конфигурацией . . .• и версиями на основе ревизий и тегов в git

1 from s e t u p t o o l s impor t s e tup2

3 s e tup (4 s e t up_r equ i r e s =[ ’ pbr ’ ] ,5 pbr=True ,6 )

Page 32: Practical Python Packaging / Стас Рудаков / Web Developer Wargaming

PracticalPython

Packaging

История

ПакетированиеsetuptoolspbrРазработка

Приятныемелочиpkg_resourcesEntry pointsConsole scriptsPlug-insExtras

Проблемы

Собираем всевоедино

pbr

1 [ metadata ]2 name = he l l o −wor ld3 autho r = Stas Rudakou4 author−ema i l = s ta s@ga rage22 . net5 d e s c r i p t i o n − f i l e = README. r s t6 [ f i l e s ]7 packages =8 h e l l o

Listing 1: setup.cfg

1 d o c u t i l s >=0.3

Listing 2: requirements.txt

Page 33: Practical Python Packaging / Стас Рудаков / Web Developer Wargaming

PracticalPython

Packaging

История

ПакетированиеsetuptoolspbrРазработка

Приятныемелочиpkg_resourcesEntry pointsConsole scriptsPlug-insExtras

Проблемы

Собираем всевоедино

Разработка

• Обновили код — запустили python setup.py install . . . точно?

• pip install -e .• tox для запуска тестов в изолированных virtualenv’ах• свой PyPI-сервер — это просто (nginx или devpi)

Page 34: Practical Python Packaging / Стас Рудаков / Web Developer Wargaming

PracticalPython

Packaging

История

ПакетированиеsetuptoolspbrРазработка

Приятныемелочиpkg_resourcesEntry pointsConsole scriptsPlug-insExtras

Проблемы

Собираем всевоедино

Разработка

• Обновили код — запустили python setup.py install . . . точно?• pip install -e .

• tox для запуска тестов в изолированных virtualenv’ах• свой PyPI-сервер — это просто (nginx или devpi)

Page 35: Practical Python Packaging / Стас Рудаков / Web Developer Wargaming

PracticalPython

Packaging

История

ПакетированиеsetuptoolspbrРазработка

Приятныемелочиpkg_resourcesEntry pointsConsole scriptsPlug-insExtras

Проблемы

Собираем всевоедино

Разработка

• Обновили код — запустили python setup.py install . . . точно?• pip install -e .• tox для запуска тестов в изолированных virtualenv’ах

• свой PyPI-сервер — это просто (nginx или devpi)

Page 36: Practical Python Packaging / Стас Рудаков / Web Developer Wargaming

PracticalPython

Packaging

История

ПакетированиеsetuptoolspbrРазработка

Приятныемелочиpkg_resourcesEntry pointsConsole scriptsPlug-insExtras

Проблемы

Собираем всевоедино

Разработка

• Обновили код — запустили python setup.py install . . . точно?• pip install -e .• tox для запуска тестов в изолированных virtualenv’ах• свой PyPI-сервер — это просто (nginx или devpi)

Page 37: Practical Python Packaging / Стас Рудаков / Web Developer Wargaming

PracticalPython

Packaging

История

ПакетированиеsetuptoolspbrРазработка

Приятныемелочиpkg_resourcesEntry pointsConsole scriptsPlug-insExtras

Проблемы

Собираем всевоедино

Приятные мелочи

Page 38: Practical Python Packaging / Стас Рудаков / Web Developer Wargaming

PracticalPython

Packaging

История

ПакетированиеsetuptoolspbrРазработка

Приятныемелочиpkg_resourcesEntry pointsConsole scriptsPlug-insExtras

Проблемы

Собираем всевоедино

pkg_resources

• модуль из состава setuptools• изначально создавался как слой доступа к ресурсам пакета(не забываем, что формат egg появился именно в setuptools)

• позволяет получить метаданные любого установленного пакета

1 >>> impor t pkg_resources2 >>> d i s t = pkg_resources . g e t_d i s t r i b u t i o n ( " p y t e s t " )3 >>> d i s t . project_name4 " p y t e s t "5 >>> d i s t . v e r s i o n6 " 2 . 6 . 4 "

Page 39: Practical Python Packaging / Стас Рудаков / Web Developer Wargaming

PracticalPython

Packaging

История

ПакетированиеsetuptoolspbrРазработка

Приятныемелочиpkg_resourcesEntry pointsConsole scriptsPlug-insExtras

Проблемы

Собираем всевоедино

pkg_resources

• модуль из состава setuptools• изначально создавался как слой доступа к ресурсам пакета(не забываем, что формат egg появился именно в setuptools)

• позволяет получить метаданные любого установленного пакета

1 >>> impor t pkg_resources2 >>> d i s t = pkg_resources . g e t_d i s t r i b u t i o n ( " p y t e s t " )3 >>> d i s t . project_name4 " p y t e s t "5 >>> d i s t . v e r s i o n6 " 2 . 6 . 4 "

Page 40: Practical Python Packaging / Стас Рудаков / Web Developer Wargaming

PracticalPython

Packaging

История

ПакетированиеsetuptoolspbrРазработка

Приятныемелочиpkg_resourcesEntry pointsConsole scriptsPlug-insExtras

Проблемы

Собираем всевоедино

Entry points

1 s e tup (2 name="my−package " ,3 # othe r arguments he r e . . .4 en t r y_po i n t s={5 " group1 " : [6 "name1 = my_package . some_module : func1 " ,7 "name2 = my_package . other_module " ,8 ] ,9 }

10 )

1 >>> impor t pkg_resources2 >>> f o r ep i n pkg_resource s . i t e r_en t r y_po i n t s ( " group1 " ) :3 . . . p r i n t ( ep . d i s t . project_name , ep . name , r e p r ( ep . l o ad ) )4 my−package name1 "<f u n c t i o n func1 at 0 x7 f f5091e5730>"5 my−package name2 "<module ’ other_module ’ from . . . >"6 other−package name3 "<f u n c t i o n func3 at 0 x7 f f5091e5730>"

Page 41: Practical Python Packaging / Стас Рудаков / Web Developer Wargaming

PracticalPython

Packaging

История

ПакетированиеsetuptoolspbrРазработка

Приятныемелочиpkg_resourcesEntry pointsConsole scriptsPlug-insExtras

Проблемы

Собираем всевоедино

Console scripts

1 s e tup (2 name=" mys i t e " ,3 # othe r arguments he r e . . .4 i n s t a l l _ r e q u i r e s = [ "Django >=1.7 ,<1.8" ] ,5 en t r y_po i n t s={6 " c o n s o l e_ s c r i p t s " : [7 "mysite_manage = mysite_manage : main" ,8 ] ,9 }

10 )

1 ( myvenv ) $ p i p i n s t a l l mys i t e2 ( myvenv ) $ which mysite_manage3 /tmp/myvenv/ b in /mysite_manage4 ( myvenv ) $ l s − l ‘ which mysite_manage ‘5 −rwxr−xr−x 1 s t a s s t a s 300 Nov 28 19 :00 /tmp/myvenv/ b in /mysite_manage

Page 42: Practical Python Packaging / Стас Рудаков / Web Developer Wargaming

PracticalPython

Packaging

История

ПакетированиеsetuptoolspbrРазработка

Приятныемелочиpkg_resourcesEntry pointsConsole scriptsPlug-insExtras

Проблемы

Собираем всевоедино

Console scripts

1 s e tup (2 name=" mys i t e " ,3 # othe r arguments he r e . . .4 i n s t a l l _ r e q u i r e s = [ "Django >=1.7 ,<1.8" ] ,5 en t r y_po i n t s={6 " c o n s o l e_ s c r i p t s " : [7 "mysite_manage = mysite_manage : main" ,8 ] ,9 }

10 )

1 ( myvenv ) $ p i p i n s t a l l mys i t e2 ( myvenv ) $ which mysite_manage3 /tmp/myvenv/ b in /mysite_manage4 ( myvenv ) $ l s − l ‘ which mysite_manage ‘5 −rwxr−xr−x 1 s t a s s t a s 300 Nov 28 19 :00 /tmp/myvenv/ b in /mysite_manage

Page 43: Practical Python Packaging / Стас Рудаков / Web Developer Wargaming

PracticalPython

Packaging

История

ПакетированиеsetuptoolspbrРазработка

Приятныемелочиpkg_resourcesEntry pointsConsole scriptsPlug-insExtras

Проблемы

Собираем всевоедино

Console scripts & Django1 import os, sys2

3 if __name__ == "__main__":4 os.environ.setdefault("DJANGO_SETTINGS_MODULE", "mysite.settings")5 from django.core.management import execute_from_command_line6 execute_from_command_line(sys.argv)

Listing 3: manage.py из состава Django

1 import os,sys2

3 def main():4 os.environ.setdefault("DJANGO_SETTINGS_MODULE", "mysite.settings")5 from django.core.management import execute_from_command_line6 execute_from_command_line(sys.argv)7

8 if __name__ == "__main__":9 main()

Listing 4: mysite_manage.py

Page 44: Practical Python Packaging / Стас Рудаков / Web Developer Wargaming

PracticalPython

Packaging

История

ПакетированиеsetuptoolspbrРазработка

Приятныемелочиpkg_resourcesEntry pointsConsole scriptsPlug-insExtras

Проблемы

Собираем всевоедино

Plug-ins на примере pytest

1 s e tup (2 name=" py t e s t−cov " ,3 d e s c r i p t i o n="py . t e s t p l u g i n f o r cove rage r e p o r t i n g wi th "4 " suppo r t f o r both c e n t r a l i s e d and d i s t r i b u t e d t e s t i n g , "5 " i n c l u d i n g s u bp r o c e s s e s and mu l t i p r o c e s s i n g " ,6 # othe r arguments he r e . . .7 i n s t a l l _ r e q u i r e s =[8 "py >=1.4.22" ,9 " py t e s t >=2.6.0" ,

10 " coverage >=3.7.1" ,11 "cov−core >=1.14.0"12 ] ,13 en t r y_po i n t s={14 " py t e s t 1 1 " : [ " pytes t_cov = pytes t_cov " ]15 } ,16 )

Listing 5: setup.py pytest-плагина pytest-cov

Page 45: Practical Python Packaging / Стас Рудаков / Web Developer Wargaming

PracticalPython

Packaging

История

ПакетированиеsetuptoolspbrРазработка

Приятныемелочиpkg_resourcesEntry pointsConsole scriptsPlug-insExtras

Проблемы

Собираем всевоедино

Extras

1 s e tup (2 name=" c e l e r y " ,3 d e s c r i p t i o n=" D i s t r i b u t e d Task Queue" ,4 # othe r arguments he r e . . .5 e x t r a s_ r e q u i r e={6 " ca s s and r a " : [ " pyca s sa " ] ,7 "mongodb" : [ "pymongo>=2.6.2" ] ,8 "msgpack" : [ "msgpack−python >=0.3.0" ] ,9 " r e d i s " : [ " r e d i s >=2.8.0" ] ,

10 "zeromq" : [ "pyzmq>=13.1.0" ] ,11 }12 )

$ p i p i n s t a l l " c e l e r y [ mongodb , msgpack , zeromq ] "

Page 46: Practical Python Packaging / Стас Рудаков / Web Developer Wargaming

PracticalPython

Packaging

История

ПакетированиеsetuptoolspbrРазработка

Приятныемелочиpkg_resourcesEntry pointsConsole scriptsPlug-insExtras

Проблемы

Собираем всевоедино

Extras

1 s e tup (2 name=" c e l e r y " ,3 d e s c r i p t i o n=" D i s t r i b u t e d Task Queue" ,4 # othe r arguments he r e . . .5 e x t r a s_ r e q u i r e={6 " ca s s and r a " : [ " pyca s sa " ] ,7 "mongodb" : [ "pymongo>=2.6.2" ] ,8 "msgpack" : [ "msgpack−python >=0.3.0" ] ,9 " r e d i s " : [ " r e d i s >=2.8.0" ] ,

10 "zeromq" : [ "pyzmq>=13.1.0" ] ,11 }12 )

$ p i p i n s t a l l " c e l e r y [ mongodb , msgpack , zeromq ] "

Page 47: Practical Python Packaging / Стас Рудаков / Web Developer Wargaming

PracticalPython

Packaging

История

ПакетированиеsetuptoolspbrРазработка

Приятныемелочиpkg_resourcesEntry pointsConsole scriptsPlug-insExtras

Проблемы

Собираем всевоедино

Проблемы

Page 48: Practical Python Packaging / Стас Рудаков / Web Developer Wargaming

PracticalPython

Packaging

История

ПакетированиеsetuptoolspbrРазработка

Приятныемелочиpkg_resourcesEntry pointsConsole scriptsPlug-insExtras

Проблемы

Собираем всевоедино

Проблемы и ограничения

• инструменты не всегда следят за конфликтами• нет понятия “поставлен по зависимости”• неочевидные различия между

p ip i n s t a l l X Y

p ip i n s t a l l Xp ip i n s t a l l Y

p ip i n s t a l l Yp ip i n s t a l l X

• pip ведет себя не так, как apt-get, yum и др. пакетные менеджеры

Page 49: Practical Python Packaging / Стас Рудаков / Web Developer Wargaming

PracticalPython

Packaging

История

ПакетированиеsetuptoolspbrРазработка

Приятныемелочиpkg_resourcesEntry pointsConsole scriptsPlug-insExtras

Проблемы

Собираем всевоедино

Собираем все воедино

1 наше настоящее: virtualenv + pip + setuptools + wheel2 на систему пакетирования мы хотим возложить

• кроссплатформенные решения проблем сборки и запуска• типичные задачи по разбиению программы на компоненты

3 на систему пакетирования мы не хотим возлагать управление системой(для этого есть ansible, chef, puppet, salt)

Page 50: Practical Python Packaging / Стас Рудаков / Web Developer Wargaming

PracticalPython

Packaging

История

ПакетированиеsetuptoolspbrРазработка

Приятныемелочиpkg_resourcesEntry pointsConsole scriptsPlug-insExtras

Проблемы

Собираем всевоедино

Стас Рудаковmailto:[email protected]://raw.github.com/nott/talks/ppp.pdf

https://packaging.python.org/https://pythonhosted.org/setuptools/