14 марта 2011 г.

Делимся Питоном с миром

Когда питоновские скрипты приобретают какую-то готовую форму, и ими хочется поделиться с другими, возникает вопрос: как это правильно и красиво сделать?

Стандартом для распространения программ на Python является Python Package Index, своего рода центральный Python-репозиторий. О процессе публикации много написано, покажу, как это делается, на своём примере.

Есть известный сайт-библиотека Lib.ru с разделом для писателей — СамИздат, СИ. С помощью PyQt и pyquery я написал программку для слежения за новинками СИ.

Первая важная деталь — в отличие от поделок "для себя", настройки нельзя хранить в текущем каталоге, для Linux нужно использовать что-то вроде `$HOME/.si_news/`:
# Folder to store all configuration
HOMEDIR = os.path.expanduser(os.path.join('~', '.si_news'))
if not os.path.isdir(HOMEDIR):
    os.mkdir(HOMEDIR)

# File name with list of friends
CFG_FRIENDS = os.path.join(HOMEDIR, 'friends.cfg')

Для простоты весь код размещается в одном файле, si_news.py. Следующий этап — выкладывание упакованных исходников на сайте PyPI. Создаём setup.py с заполненными метаданными приложения:
from setuptools import setup

setup(
    name='si-news',
    version='0.1.1',
    description='Tracks updates for zhurnal.lib.ru authors',
    author='Denis Malinovsky',
    author_email='dmalinovsky@gmail.com',
    url='https://bitbucket.org/dmalinovsky/si-news/',
    py_modules=['si_news'],
    install_requires=['distribute', 'pyquery'],
    license='gpl',
    classifiers=[
        'Development Status :: 3 - Alpha',
        'Environment :: MacOS X',
        'Environment :: Win32 (MS Windows)',
        'Environment :: X11 Applications :: Qt',
        'Intended Audience :: End Users/Desktop',
        'License :: OSI Approved :: GNU General Public License (GPL)',
        'Natural Language :: Russian',
        'Operating System :: OS Independent',
        'Programming Language :: Python',
        'Topic :: Internet :: WWW/HTTP',
        'Topic :: Utilities',
        ],
    entry_points = {
        'gui_scripts': [
            'si_news = si_news',
            ]
        },
)

Встроенный в Python distutils не позволяет обрабатывать зависимости при установке, поэтому я использовал наследника брошенного setuptools, distribute. Метаданные в setup.py говорят сами за себя, два комментария — classifiers позволяет отнести программу к нужным категориям PyPI, а entry_points создаёт команды для запуска разных частей нашего приложения.

Затем запускаем `python setup.py register sdist upload` для регистрации на сайте PyPI, упаковки исходников в tar.gz и загрузки на сайт.

К сожалению, PyQt нельзя установить с помощью setuptools и т.п., приходится ставить по старинке, с помощью `apt-get install python-qt4`. Зато саму программу можно установить с помощью замечательного инсталлятора pip: `pip install si-news`.