Собираем питоновский пакет и выкладываем на pypi

Питоновские пакеты отличный способ повторного использования кода. Если один и тот же код вы уже в третий раз копируете в очередной проект, самое время вынести этот код в отдельный модуль. А еще лучше будет собрать питоновский пакет, который потом будет устанавливаться одной командой.

Например если мы выложили пакет на github, то установить его можно так (django-cleanup в данном случае пример названия пакета):

pip install -e git+git://github.com/un1t/django-cleanup.git#egg=django-cleanup

А если мы залили его на pypi.python.org, то установка будет еще проще:

pip install django-cleanup

Структура пакета

Рассмотрим структуру простого пакета на примере django-cleanup.

django_cleanup/  # папка с модулем
    __init__.py
    models.py
MANIFEST.in 
README.markdown
setup.py

setup.py — отвечает за сборку и установку пакета. Обязательные поля — name, version и url. Можно смело копировать пример в свой пакет, заменив нужные значения. Подробнее об этом файле можно прочитать в документации.

#!/usr/bin/env python
# -*- coding: utf-8 -*-

from setuptools import setup, find_packages

setup(
    name     = 'django-cleanup',
    version  = '0.1.5',
    packages = find_packages(),
    requires = ['python (>= 2.5)', 'django (>= 1.3)'],
    description  = 'Deletes old files.',
    long_description = open('README.markdown').read(), 
    author       = 'Ilya Shalyapin',
    author_email = 'ishalyapin@gmail.com',
    url          = 'https://github.com/un1t/django-cleanup',
    download_url = 'https://github.com/un1t/django-cleanup/tarball/master',
    license      = 'MIT License',
    keywords     = 'django',
    classifiers  = [
        'Environment :: Web Environment',
        'Framework :: Django',
        'Intended Audience :: Developers',
        'Programming Language :: Python',
    ],
)

MANIFEST.in — показывает какие дополнительно файлы должны быть включены в дистрибутив, в нашем случае это README.markdown.

include README.markdown

README.markdown — надо сказать что в питоне принято писать ридми в формате RST, т.е. в идеале должно быть README.rst, но мне markdown как-то привычней.

Проверка пакета

После того как создали вышеуказанню структуру пакета неплохо бы проверить, будет ли вообще этот пакет устанавливаться. Ведь можно допустить элементарные синтаксические или другие ошибки. Например все это у нас будет храниться в папке /home/ilya/workspace/django-cleanup/
Соотвественно мы можем установить наш пакет так

pip install -e /home/ilya/workspace/django-cleanup/

и удалить

pip uninstall django-cleanup

Загрузка на PYPI

Если у вас еще нет учетной записи на pypi.python.org, вам нужно зарегистрироваться.

Регистрируем пакет:

python setup.py register

Собираем дистрибутив и загружаем его:

python setup.py sdist upload

Если все прошло гладко то, после этого уже можно ставить свой пакет через pip или easy_install.

Если что-то не сработало или пошло не так, берите любой пакет с того же pypi и смотрите как он устроен.

Ссылки по теме

1. Writing the Setup Script
2. Getting Started With setuptools and setup.py
3. Uploading Packages to the Package Index