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 -- 私人/商业项目的配置

使用 setup.py 的 extras_require 中定义的要求

我在 setup.py 中需要啥选项才能在正确的目录中创建包?

在 setup.py 中使用额外的 python 包索引 url

requirements.txt 与 setup.py

在 setup.py 文件中直接包含一个 pyd