python的setuptools是否支持`__name__ ==“__ main __”`执行方式?

时间:2011-04-10 22:59:42

标签: python setuptools

我刚刚开始使用setuptools进行打包,似乎安装python脚本和一个模块的推荐方法是指定一个调用函数名称的脚本名称,如下所示:

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

这显然排除了制作python模块可执行文件的标准方法,即(我上次检查过,不久之前)使用if __name__ == "__main__": do_stuff()。 setuptools是否支持这种风格,还是应该切换到定义主函数并在entry_points中指定它?

1 个答案:

答案 0 :(得分:9)

它是:"script_name = project.main:do_stuff和setuptools

Setuptools创建名为script_name的脚本,用于导入和运行函数project.main:do_stuff,而不是直接运行脚本。你应该重新阅读setuptools docs的this partalternate link,如果你使用Distribute)来理解为什么会这样。它创建的脚本仍包含if __name__ == "__main__"。所以,是的,这仍然是实现它的实际方式。

这是使用setuptools

安装的easy_install的副本
#!/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()来访问您的应用程序,而无需在shell中运行它,这就是setuptools正在执行的操作,而不是复制脚本。