Поясніть точки входу Python?


181

Я читав документацію про точки введення яєць на Пілонах та на сторінках Піку, і досі не розумію. Може хтось мені їх пояснить?

Відповіді:


168

"Точка входу", як правило, є функцією (або іншим об'єктом, схожим на функцію дзвінка), який розробник або користувач вашого пакету Python може захотіти використовувати, хоча об'єкт, що не викликається, може бути також наданий як точка входу (як правильно вказано в коментарях!).

Найпопулярнішим видом точки входу є точка входу console_scripts , яка вказує на функцію, яку ви хочете зробити доступною як інструмент командного рядка для всіх, хто встановлює ваш пакет. Це входить у ваш setup.py, наприклад:

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

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

$ cursive --help
usage: cursive ...

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

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

і так далі; слід припустити, що він викликається з командного рядка, проаналізує аргументи, які надав користувач, і ... ну, роби все, що команда призначена.

Встановіть пакет docutils для чудового прикладу використання точки вступу: він встановить щось на зразок півдесятка корисних команд для перетворення документації Python в інші формати.


3
поточні документи ' setup.pyзовсім не містять entry_points.
matt wilkie

2
Це відмінна відповідь, оскільки він демонструє потужність декількох проектів, що мають спільне ім'я групи_вступних_групп, яке є "console_scripts". Порівняйте цю відповідь із більш загальною відповіддю Петрі. Ви побачите, що setuptools повинні використовувати цей механізм pkg_resources, щоб отримати консольні_скрипти, а потім створити навколо них оболонку оболонки. Натхненно? Використовуйте ці. Вони корисні для більш ніж просто консольних_скриптів.
Бруно Броноський

188

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.


4
Де ім'я 'my_ep_func' використовується у всьому цьому процесі? Схоже, ітератор pkg_resources ні для чого не використовується.
Каміль Кісієль

2
@KamilKisiel: у прикладі, використаному для ілюстрації тут, назва точки вводу насправді не використовується ні для чого, і не потрібно; незалежно від того, застосовується ім’я точки входу чи ні, залежить від програми. Назву можна просто як ім'я атрибут реалізації точки входу.
Петрі

3
Я думаю, що скасування ep.name та створення списку name_objects замість словника було заплутаним, тому я відредагував відповідь. Це відповідь показує, як отримати ім'я та чи слід очікувати, що це буде "the_function" або "my_ep_func". Інакше читачеві довелося знайти додаткову документацію в іншому місці. Це ОТЛИЧНА відповідь і є найкоротшим, найяснішим поясненням вхідних точок, які я коли-небудь бачив!
Бруно Броноський

3
Я створив проект на github, який демонструє цю концепцію. github.com/RichardBronosky/entrypoint_demo
Бруно Броноскі

1
Це дуже чітке пояснення вхідних точок, яке ви для детального пояснення. EntryPointsПосилання несвіжа, хоча пояснення дуже ясно.
Рахул Наїр

18

З абстрактної точки зору, точки входу використовуються для створення загальносистемного реєстру викликів Python, які реалізують певні інтерфейси. Є API в pkg_resources, щоб побачити, які точки входу рекламується певним пакетом, а також API, щоб визначити, які пакети рекламують певну точку входу.

Пункти введення корисні для дозволу одного пакету використовувати плагіни, які є в іншому. Наприклад, проект Ist Bicking Paste широко використовує вхідні точки. У цьому випадку ви можете написати пакет, який рекламує свою фабрику додатків WSGI, використовуючи точку входуpaste.app_factory .

Інше використання для точок входу - це перерахування всіх пакетів у системі, які надають деяку функціональність плагінів. TurboGears веб - фреймворк використовує python.templating.enginesточку входу для пошуку шаблонних бібліотек, які встановлені і доступні.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.