Я прочитал документацию о точках ввода яйца в Pylons и на страницах Peak, и я до сих пор не совсем понимаю. Может кто-нибудь объяснить их мне?
Объясните точки входа Python?
Ответ 1
"Точка входа" обычно является функцией (или другим вызываемым функциональным объектом), который может использовать разработчик или пользователь вашего пакета 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: ..."
и т.д.; он должен предположить, что он был вызван из командной строки, проанализировал аргументы, предоставленные пользователем, и... ну, сделайте все, что предназначена для этой команды.
Установите пакет docutils для отличного примера использования точки входа: он установит что-то вроде полудюжины полезных команд для преобразование документации Python в другие форматы.
Ответ 2
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. Затем он записывает разобранную информацию в специальный файл. После этого API pkg_resources (часть 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.
Ответ 3
С абстрактной точки зрения точки входа используются для создания общесистемного реестра вызывающих Python-вызовов, которые реализуют определенные интерфейсы. В pkg_resources есть API-интерфейсы, чтобы узнать, какие точки входа рекламируются данным пакетом, а также API-интерфейсы, чтобы определить, какие пакеты рекламируют определенную точку входа.
Точки входа полезны для того, чтобы позволить одному пакету использовать плагины, которые находятся в другом пакете. Например, Ian Bicking Paste проект использует точки входа широко. В этом случае вы можете написать пакет, который рекламирует приложение WSGI factory, используя точку входа paste.app_factory
.
Другое использование для точек входа - это перечисление всех пакетов в системе, которые предоставляют некоторые функции плагина. В веб-инфраструктуре TurboGears используется запись python.templating.engines
чтобы искать шаблоны библиотек, которые установлены и доступны.