Публикация Python пакета в PyPI

PyPI (Python Package Index, не путать с PyPy) — это репозиторий сторонних пакетов для Python. Тех самых, которые обычно ставятся через команду pip.

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

foobar-package
├── LICENSE.txt
├── MANIFEST.in
├── README.rst
├── setup.py
└── foobar_package
    ├── __init__.py
    ├── bar.py
    └── foo.py

README.rst

Все проекты обычно включают в себя файл с описанием и примерами кода, для того, чтобы понять, как этим пакетом пользоваться.

Описание пишется в формате reStructuredText. На самом деле оно может быть в любом текстовом формате, но сайт PyPI умеет форматировать только rst.

MANIFEST.in

В файле перечисляются дополнительные файлы, которые должны быть включены в пакет. По умолчанию в пакет включаются только *.py файлы. Этого недостаточно, если вы пишите приложение для Django, в котором кроме питоновских файлов есть шаблоны и картинки.

include LICENSE.txt
recursive-include foobar_package/static *
recursive-include foobar_package/templates *

setup.py

Файл с описанием пакета. Его название, версия, зависимости и прочая техническая информация. Минимальная рабочая версия его выглядит вот так:

from setuptools import setup, find_packages

setup(
    name='foobar-package',
    version='1.0.0',
    packages=find_packages(),
    author='John Smith',
    author_email='johnsmith@example.com',
    url='https://github.com/johnsmith/foobar-package',
)

Как разрабатывать

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

$ pip install --editable .

Вместо копирования файлов в каталог с пакетами туда помещается символическая ссылка на текущую директорию.

Загрузка пакета в PyPI

Нужно создать аккаунт на сайте PyPI и указать его реквизиты в файле ~/.pypirc.

[distutils]
index-servers = pypi

[pypi]
repository = https://pypi.python.org/pypi
username = <username>
password = <password>

Теперь выполняем две команды:

$ python setup.py register
$ python setup.py sdist upload

Первая регистрирует пакет в PyPI. Её нужно выполнить только один раз. Вторая собирает исходники в архив и отправляет в репозиторий.

Вместо стандартных register и upload, рекомендуют использовать twine. Это тоже самое, только по HTTPS.

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