entry_points / console_scripts和setup.py中的脚本之间的区别?

基本上有两种方法通过setup.py将Python控制台脚本安装到我的path中:

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

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

有什么区别? 我看到第一种方法允许我为脚本select好的,特定的名称,但是还有其他的区别吗? 不同的原始目的,兼容性(setuptools,distutils,…?),用法,…? 我很困惑,一个精心制作的答复可以帮助我(也可能是其他人)正确理解这一切。

更新:因为我问了这个问题, PyPA 在这个话题上发表了这些很酷的文档 。

(awesome)Click包的文档提示了一些使用入口点的原因 ,而不是脚本,包括

  1. 跨平台兼容性和
  2. 避免让解释器将\__name__分配给\__main__ ,这可能导致代码被导入两次(如果另一个模块导入了您的脚本)

点击是一个很好的方式来实现函数作为entry_points ,顺便说一句。

创build命令行可执行文件的两种方法之间的一个主要区别是,使用setuptools方法(您的第一个示例),您必须在脚本内部调用一个函数 – 在您的情况下,这是module内部的func 。 然而,在distutils方法(你的第二个例子),你直接调用脚本(允许被列出有或没有扩展名)。

设置工具入口点方法(#1)也有一个好处 ,就是在窗口上.exe会被创build,可以被双击并像普通的windows程序一样被调用。 这是除了在类似posix的系统上的脚本path中放置脚本之外。

还有一个不同是,当使用console_scripts时,我的模块的init文件已经运行。 当只使用脚本时,模块init不运行,只运行脚本。