Пакеты в python

Пакеты - одна из полезных и интересных возможностей Python. Особенно это востребовано в крупных проектах. Возможности пакетов огромны, но они не обязательно должны быть сложными. Однако из-за их гибкости для работы с ними надо перечитать довольно много различной информации, которая переодичечки меняется. Да еще имееются разные библиотеки (distutils, setuptools, distribute), которые решают практически одинаковые задачи.

Попробуем систематизировать информацию по созданию собственных пакетов на примере простейшего проекта “SampleProject”.

Что представляет собой наш проект:

  • пакет sample_project
  • метод, который возвращает текущее время
  • исполняемый скрипт, который печатает текущее время на консоль

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

Итак проект:

the-sample-project
|-- sample_project
|       |-- __init__.py
|       |-- core.py
|-- setup.py

Далее создаем нашу бизнес логику. Нам надо 2 метода. Один генерит текущее время в виде строки, а второй - печатает его на консоль. Код располагается в sample_project/core.py:

import datetime

def get_current_time():
    return str(datetime.datetime.now())

def print_current_time():
    print get_current_time()

Далее создадим простейший setup.py файл. Так же добавим README.txt с описанием пакета, что является хорошей практикой.

Description
===========

An example Sample Project

Наш setup.py:

from setuptools import setup, find_packages
from os.path import join, dirname

setup(
    name="sample_project",
    version="1.0",
    packages=find_packages(),
    long_description=open(join(dirname(__file__), "README.txt").read(),
)

Теперь мы можем создать дистрибутив пакета с помощью комманды:

python setup.py sdist

В результате выполнения создастся файл dist/sample_project-1.0.tar.gz

Добавим теперь в пакет выполняемый скрипт. Для этого согласно документации к distribute необходимо определить аргумент entry_points в списке параметров метода setup(). В итоге получаем:

from setuputils import setup, find_packages
from os.path import join, dirname

setup(
    name="sample_project",
    version="1.0",
    packages=find_packages(),
    long_description=open(join(dirname(__file__), "README.txt")).read(),
    entry_points={
        "console_scripts":
            ["sample_project = sample_project.core:print_current_time"]
        }
)

Что мы сделали:

  • sample\_project = … Создать выполняемый скрипт с именем sample_project
  • … = sample_project.core:… Расположение метода в пакете
  • …:print_current_time Вызов метода на выполнение

После установки пакета будет доступен выполняемый файл в локальной bin директории, который вызывает указанный метод.

 
comments powered by Disqus