Разница между 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.