我刚刚开始使用setuptools进行打包,似乎安装python脚本和一个模块的推荐方法是指定一个调用函数名称的脚本名称,如下所示:
setup(
# ...
entry_points = {
"console_scripts": [
"script_name": "project.main:main",
],
}
)
这显然排除了制作python模块可执行文件的标准方法,即(我上次检查过,不久之前)使用if __name__ == "__main__": do_stuff()
。 setuptools是否支持这种风格,还是应该切换到定义主函数并在entry_points中指定它?
答案 0 :(得分:9)
它是:"script_name = project.main:do_stuff
和setuptools
Setuptools创建名为script_name
的脚本,用于导入和运行函数project.main:do_stuff
,而不是直接运行脚本。你应该重新阅读setuptools docs的this part(alternate 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正在执行的操作,而不是复制脚本。