setup.py 中 entry_points/console_scripts 和脚本之间的区别?
Posted
技术标签:
【中文标题】setup.py 中 entry_points/console_scripts 和脚本之间的区别?【英文标题】:Difference between entry_points/console_scripts and scripts in setup.py? 【发布时间】:2013-09-18 04:24:51 【问题描述】:基本上有两种方法可以通过setup.py
将Python控制台脚本安装到我的路径:
setup(
...
entry_points =
'console_scripts': [
'foo = package.module:func',
],
)
和
setup(
...
scripts = [
'scripts/myscript.sh'
]
)
有什么区别?我看到第一种方法允许我为我的脚本选择好的、特定的名称,但还有其他区别吗?不同的原始用途、兼容性(setuptools、distutils、...?)、用法、...?我很困惑,一个详细的回答可以帮助我(可能还有其他人)正确理解这一切。
更新:自从我问了PyPA 发布的these cool docs on the topic 的问题。
【问题讨论】:
[更新] 链接已损坏。我相信packaging.python.org/distributing/#scripts 是替代品(?) 您更新中的链接再次更新:python-packaging-user-guide.readthedocs.io/guides/… 修复链接,谢谢! 【参考方案1】:这两种创建命令行可执行文件的方法之间的一个关键区别是,使用setuptools
方法(您的第一个示例),您必须在脚本内部调用一个函数——在您的情况下,这是func
在您的module
内。但是,在 distutils
方法(您的第二个示例)中,您可以直接调用脚本(允许在有或没有扩展名的情况下列出)。
【讨论】:
我认为这个答案错过了要点。 entry_point 方法是我们都应该使用的新方法。任何时候有 setuptools 替代 distutils 功能,都是有充分理由的。 另外,scripts
似乎是包含自定义脚本的唯一方法,例如 WSGI 脚本而不是命令行脚本。 entry_points
将始终生成某种命令行可执行文件。 (这是否是一个好的想法,我不确定,但这是一个观察结果。)【参考方案2】:
设置工具入口点方法 (#1) 还具有the benefit,在 Windows 上将创建一个 .exe,可以像常规 Windows 程序一样双击和调用。这是在类 posix 系统上将脚本放置在 bin 路径中的补充。
【讨论】:
【参考方案3】:(很棒的)Click 包 suggest a few reasons 的文档使用入口点而不是脚本,包括
-
跨平台兼容性和
避免让解释器将
__name__
分配给 __main__
,这可能会导致代码被导入两次(如果另一个模块导入您的脚本)
Click 是一种很好的方式来实现用作entry_points
的函数,顺便说一句。
【讨论】:
这是正确的答案。基本上旧的 distutils 存在很多问题。一群非常聪明的人创建了 setuptools 来取代它。他们合作并提出了 entry_points/console_scripts 机制作为可执行分发的标准,因此您不必考虑所有其他选项的问题。不要成为英雄。使用你得到的东西。 我想补充一点,因为我提出了这个问题,所以出现了这些很棒的文档:python-packaging-user-guide.readthedocs.org/en/latest/… 不幸的是@HonzaJavorek - 那些“很棒的文档”现在是 404 / 不存在:/ 它们存在,只是结构发生了变化。新链接:python-packaging-user-guide.readthedocs.io/search/?q=scripts 您能进一步解释一下“两次导入”吗?我的印象是使用“if name == 'main':'”来解决这个问题?【参考方案4】:另一个区别是,当使用 console_scripts 时,我的模块的 __init__
文件被运行。只使用脚本时,模块__init__
没有运行,只运行了脚本。
【讨论】:
以上是关于setup.py 中 entry_points/console_scripts 和脚本之间的区别?的主要内容,如果未能解决你的问题,请参考以下文章
使用 setup.py 的 extras_require 中定义的要求
我在 setup.py 中需要啥选项才能在正确的目录中创建包?