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

В основном есть два способа установки сценариев консоли Python на мой путь setup.py:

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

и

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

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

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

Ответ 1

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

  • кросс-платформенная совместимость и
  • избегая перевода интерпретатора \__name__ в \__main__, что может привести к тому, что код будет импортирован дважды (если другой модуль импортирует ваш script)

Click - отличный способ реализовать функции для использования как entry_points, btw.

Ответ 2

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

Ответ 3

Подход точки входа в инструменты установки (# 1) также имеет преимущество, которое на windows будет создаваться .exe, которое можно дважды щелкнуть и вызывается как обычная программа Windows. Это в дополнение к наличию script, помещенного в путь bin в posix-подобных системах.

Ответ 4

Еще одно отличие заключается в том, что при использовании console_scripts запускался мой файл init. При использовании скриптов модуль init не запускался, запускался только script.