【问题标题】:Difference between entry_points/console_scripts and scripts in setup.py?setup.py 中 entry_points/console_scripts 和脚本之间的区别?
【发布时间】: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 的问题。

【问题讨论】:

标签: python package setup.py


【解决方案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 的文档使用入口点而不是脚本,包括

    1. 跨平台兼容性和
    2. 避免让解释器将 __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__没有运行,只运行了脚本。

    【讨论】:

      猜你喜欢
      • 2013-12-18
      • 2018-05-28
      • 2017-05-07
      • 1970-01-01
      • 2013-03-21
      • 1970-01-01
      • 2014-06-26
      • 2011-04-23
      相关资源
      最近更新 更多