• 01 Апр
  • 2015
Публикация пакета на PyPI

В процессе разработки очередного проекта на Django я столкнулся с тем, что некий код переходит из одного проекта в другой с небольшими изменениями. Сейчас не буду рассказывать, о каком именно коде идет речь, но я понял, что его можно вынести в отдельный пакет, добавить опции и в последствии использовать в других проектах, когда это понадобится. И вот когда мой модуль был готов к первому тестовому запуску я столкнулся с проблемой: как выложить свой пакет на pypi, чтобы потом установить его при помощи pip.

Конечно можно сделать это и вот так:

pip install -e git+git://github.com/user/package_name.git#egg=package_name

или даже так:

pip install -e /home/user/python/package_name

Но, согласитесь, что намного удобнее и красивее, если пакет будет ставиться вот так:

pip install package_name

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

project_directory/  # директория модуля
    __init__.py  # скрипт инициализации
    main.py  # файлы скрипта
    ...
DESCRIPTION  # описание пакета
MANIFEST.in  # файл для подключения медиа-файлов
README  # симлинк на README.rst для Github
README.rst  # короткое описание и примеры использования пакета
setup.py  # установщик

Файл MANIFEST.in

include README README.rst DESCRIPTION
exclude *.pyc

Файл setup.py

# -*- coding: utf-8 -*-
import os
from setuptools import setup, find_packages

setup(
    name="<package_name>",
    version=__import__('<package_name>').__version__,
    description=open(os.path.join(os.path.dirname(__file__), "DESCRIPTION")).read(),
    license="The MIT License (MIT)",
    keywords="<keywords>",

    author="<name>",
    author_email="<email>",

    maintainer="<name>",
    maintainer_email="<email>",

    url="<site_url>",
    packages=find_packages(exclude=["tests.*", "tests"]),
    classifiers=[
        'Intended Audience :: Developers',
        'Framework :: Django',
        'Environment :: Web Environment',
        'Operating System :: OS Independent',
        'Programming Language :: Python',
    ],
)

В файле __init__.py вашего пакета нужно прописать переменную __version__. Нужно отметить, что при каждом изменении и обновлении пакета на pypi нужно менять переменную версии, иначе пакет не перезальется.

Желательно проверить созданный проект и установить его из локальной папки. Это нужно сделать для того, чтобы убедиться, что вы не допустили никаких ошибок при составлении setup.py.

Загрузка пакета на pypi

Перед тем, как приступить к загрузке, следует завести аккаунт на pypi.python.org, если вы не сделали этого ранее. Затем в консоли переходим в директорию проекта и выполняем команду:

python setup.py register

Вас попросят ввести логин и пароль от pypi.python.org и предложат создать ключ авторизации, чтобы в следующий раз авторизация прошла самостоятельно.

Теперь можно собрать дистрибутив и загрузить его на сервер:

python setup.py sdist upload

Если операция прошла успешно и вы не увидели никаких ошибок, то теперь можно устанавливать ваш пакет на любой машине из сети при помощи pip или easy_install.

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

Спасибо за внимание! Успехов в разработке!

comments powered by Disqus