Объясните точки входа Python? - PullRequest
164 голосов
/ 22 апреля 2009

Я прочитал документацию по точкам входа яиц в Pylons и на страницах Peak, и до сих пор не совсем понимаю. Может ли кто-нибудь объяснить мне их?

Ответы [ 3 ]

177 голосов
/ 08 марта 2012

EntryPoints обеспечивают постоянную регистрацию имен объектов на основе файловой системы и механизм прямого импорта объектов на основе имен (реализован в пакете setuptools ).

Они связывают имена объектов Python с идентификаторами свободной формы. Таким образом, любой другой код, использующий ту же установку Python и знающий идентификатор, может получить доступ к объекту со связанным именем, независимо от того, где этот объект определен. связанные имена могут быть любыми именами, существующими в модуле Python ; например имя класса, функции или переменной. Механизм точки входа не заботится о том, к чему относится имя, если он импортируется.

В качестве примера, давайте использовать (имя) функцию и воображаемый модуль Python с полностью определенным именем 'myns.mypkg.mymodule':

def the_function():
   "function whose name is 'the_function', in 'mymodule' module"
   print "hello from the_function"

Точки входа регистрируются через объявление точек входа в setup.py. Чтобы зарегистрировать функцию в точке входа под названием my_ep_func:

    entry_points = {
        'my_ep_group_id': [
            'my_ep_func = myns.mypkg.mymodule:the_function'
        ]
    },

Как показывает пример, точки входа сгруппированы; есть соответствующий API для поиска всех точек входа, принадлежащих группе (пример ниже).

После установки пакета (т. Е. Запуска «python setup.py install») вышеуказанное объявление анализируется программой setuptools. Затем он записывает разобранную информацию в специальный файл. После этого pkg_resources API (часть setuptools) можно использовать для поиска точки входа и доступа к объекту (ам) с соответствующими именами:

import pkg_resources

named_objects = {}
for ep in pkg_resources.iter_entry_points(group='my_ep_group_id'):
   named_objects.update({ep.name: ep.load()})

Здесь setuptools считывает информацию о точке входа, которая была записана в специальные файлы. Она нашла точку входа, импортировала модуль (myns.mypkg.mymodule) и извлекла определенную там функцию после вызова pkg_resources.load ().

При условии, что не было других регистраций точек входа для того же идентификатора группы, вызов функции _ был бы простым:

>>> named_objects['my_ep_func']()
hello from the_function

Таким образом, хотя поначалу это немного сложно понять, механизм точки входа на самом деле довольно прост в использовании. Он предоставляет полезный инструмент для разработки подключаемого программного обеспечения Python.

146 голосов
/ 23 апреля 2009

«Точка входа» - это, как правило, функция (или другой вызываемый функциональный объект), который может захотеть использовать разработчик или пользователь вашего пакета Python, хотя в качестве точки входа может быть также предоставлен и не вызываемый объект (как правильно указано в комментариях!).

Самым популярным видом точки входа является точка входа "console_script", которая указывает на функцию, которую вы хотите сделать доступной в качестве инструмента командной строки для любого, кто устанавливает ваш пакет. Это идет в ваш setup.py как:

entry_points={
    'console_scripts': [
        'cursive = cursive.tools.cmd:cursive_command',
    ],
},

У меня есть только что развернутый пакет, называемый "cursive.tools", и я хотел, чтобы он сделал доступной команду "cursive", которую кто-то может запустить из командной строки, например:

$ cursive --help
usage: cursive ...

Способ сделать это - определить функцию, например, функцию "cursive_command" в cursive / tools / cmd.py, которая выглядит следующим образом:

def cursive_command():
    args = sys.argv[1:]
    if len(args) < 1:
        print "usage: ..."

и т. Д .; следует предположить, что он был вызван из командной строки, проанализировать аргументы, предоставленные пользователем, и ... ну, делать то, для чего предназначена команда.

Установите пакет documentstils для отличного примера использования точки входа: он установит примерно полдюжины полезных команд для преобразования документации Python в другие форматы.

16 голосов
/ 22 апреля 2009

С абстрактной точки зрения, точки входа используются для создания общесистемного реестра вызовов Python, которые реализуют определенные интерфейсы. В pkg_resources есть API для просмотра того, какие точки входа объявляются данным пакетом, а также API для определения того, какие пакеты рекламируют определенную точку входа.

Точки входа полезны для того, чтобы один пакет мог использовать плагины из другого пакета. Например, проект Ian Bicking Paste широко использует точки входа. В этом случае вы можете написать пакет, который рекламирует свою фабрику приложений WSGI, используя точку входа paste.app_factory.

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

...