Різниця між entry_points / console_scripts і скриптами в setup.py?


80

В основному є два способи встановити скрипти консолі Python на мій шлях шляхом setup.py:

setup(
    ...
    entry_points = {
        'console_scripts': [
            'foo = package.module:func',
        ],
    }
)

і

setup(
    ...
    scripts = [
        'scripts/myscript.sh'
    ]
)

Які відмінності? Я бачу, що перший підхід дозволяє мені вибрати приємне, конкретне ім’я для мого сценарію, але чи є інші відмінності? Різні оригінальні цілі, сумісність (setuptools, distutils, ...?), Використання, ...? Я досить розгублений, і приємна детально розроблена відповідь може допомогти мені (і, мабуть, також іншим) правильно зрозуміти все це.

Оновлення: Оскільки я задав питання, PyPA опублікував ці цікаві документи на цю тему .


1
Посилання [оновлення] порушено. Я вважаю , що packaging.python.org/distributing/#scripts є заміною (?)
матові Вілок

1
Так, дякую за повідомлення. Я
оновлю

Відповіді:


46

Документи пакета (дивним) Click пропонують кілька причин використовувати точки входу замість сценаріїв, зокрема

  1. міжплатформна сумісність та
  2. уникнути необхідності інтерпретатора Присвоїти __name__до __main__, що може привести код для імпорту в два рази (якщо інший модуль імпортує сценарій)

Клацніть - це приємний спосіб реалізувати функції для використання як entry_points, до речі.


10
Це правильна відповідь. В основному там, де багато проблем зі старими дистутілами. Купа по-справжньому розумних людей створила setuptools, щоб замінити його. Вони співпрацювали і придумали механізм entry_points / console_scripts, який буде стандартом для розповсюджуваного файлу, тому вам не доведеться думати про проблеми з усіма іншими параметрами. Не будь героєм. Використовуйте те, що вам дали.
Бруно Броноскі

Я хотів би додати, що з моїм
Хонза Яворек

На жаль, @HonzaJavorek - ці "дивовижні документи" тепер 404 / не існують: /
Дан

Вони існують, змінилася лише структура. Нове посилання: python-packaging-user-guide.readthedocs.io/search/?q=scripts
Хонза Яворек

2
Чи можете ви пояснити далі "імпортовано двічі"? У мене склалося враження, що для вирішення цієї проблеми використовується "if name == ' main ': '"?
tribbloid

14

Однією з ключових відмінностей між цими двома способами створення виконуваних файлів командного рядка є те, що за допомогою setuptoolsпідходу (ваш перший приклад) вам потрібно викликати функцію всередині сценарію - у вашому випадку це funcвсередині вашого module. Однак у distutilsпідході (ваш другий приклад) ви викликаєте скрипт безпосередньо (що дозволяє бути в списку з розширенням або без нього).


9
Я думаю, що ця відповідь пропускає головне. Підхід "точка_входу" - це новий спосіб, яким ми всі повинні користуватися. У будь-який час, коли є установочні інструменти, альтернативні функціоналу distutils, це з дуже вагомих причин.
Бруно Броноскі

4
З іншого боку, здається, що scriptsце єдиний спосіб включити власний сценарій, наприклад сценарій WSGI замість сценарію командного рядка. entry_pointsзавжди буде генерувати виконуваний файл командного рядка. (Чи це хороша ідея, я не впевнений, але це спостереження.)
jpmc26

9

Підхід до точки входу до інструментів налаштування (# 1) також має ту перевагу, що у Windows буде створено .exe, яке можна двічі клацнути та викликати як звичайну програму Windows. Це на додаток до того, що скрипт розміщується у шляху до смітника в подібних до posix системах.


2

Ще одна відмінність полягає в тому, що при використанні console_scripts був запущений файл ініціалізації мого модуля . Під час використання скриптів модуль init не запускався, запускався лише сценарій.

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