Поддерживает ли python setuptools стиль исполнения `__name__ ==" __main __ "`? - PullRequest
9 голосов
/ 11 апреля 2011

Я только начинаю упаковывать файлы с помощью setuptools, и кажется, что рекомендуемый способ установки скрипта python вместе с модулем - это указать имя скрипта, которое вызывает имя функции, например:

setup(
    # ...
    entry_points = {
        "console_scripts": [
            "script_name": "project.main:main",
        ],
    }
)

Это явно исключает стандартный способ создания исполняемого модуля Python, который (в последний раз, когда я проверял, что было некоторое время назад) использовал if __name__ == "__main__": do_stuff().Поддерживает ли setuptools этот стиль, или я должен переключиться на определение основной функции и указание ее в entry_points?

1 Ответ

9 голосов
/ 11 апреля 2011

Это: "script_name = project.main:do_stuff с помощью setuptools

Setuptools создает сценарии с именем script_name, которые импортируют и запускают функцию project.main:do_stuff, а не запускают сценарий напрямую.Вам следует перечитать эту часть ( альтернативная ссылка , если вы используете Distribute) документации по setuptools еще раз, чтобы понять, почему это так.Сценарий, который он создает, содержит if __name__ == "__main__" еще.Так что да, это все еще дефактный способ заставить его исполниться.

Это копия easy_install, установленная с setuptools

#!/usr/bin/python
# EASY-INSTALL-ENTRY-SCRIPT: 'distribute==0.6.14','console_scripts','easy_install'
__requires__ = 'distribute==0.6.14'
import sys
from pkg_resources import load_entry_point

if __name__ == '__main__':
    sys.exit(
        load_entry_point('distribute==0.6.14', 'console_scripts', 'easy_install')()
    )

Я думаю, что лучше всего определить точку входа и скриптпохож на easy_install.Это импортирует и использует точку входа, как показано в вашем примере if __name__ == "__main__": do_stuff().Он отлично подходит для отладки и раннего тестирования, даже если вы используете distutils , нет необходимости добавлять / изменять что-либо.У вас также может быть другое приложение для вызова do_stuff () для доступа к вашему приложению без дополнительных затрат на его запуск в оболочке, что и делает setuptools, distutils copy - это сценарий.

...