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

Hon*_*rek 57 python package setup.py

基本上有两种方法可以将Python控制台脚本安装到我的路径中setup.py:

setup(
    ...
    entry_points = {
        'console_scripts': [
            'foo = package.module:func',
        ],
    }
)
Run Code Online (Sandbox Code Playgroud)

setup(
    ...
    scripts = [
        'scripts/myscript.sh'
    ]
)
Run Code Online (Sandbox Code Playgroud)

有什么区别?我看到第一种方法允许我为我的脚本选择不错的特定名称,但是还有其他差异吗?不同的原始用途,兼容性(setuptools,distutils,......?),用法,......?我很困惑,一个精心设计的回复可以帮助我(也可能还有其他人)正确理解这一切.

更新:因为我问过PyPA 在这个主题上发表了这些很酷的文档.

小智 38

(真棒)Click包的文档提出了使用入口点而不是脚本的几个原因,包括

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

Click是一种实现函数的好方法,可以用作entry_pointsbtw.

  • 这是正确的答案.基本上那里有很多问题与旧的distutils.一群非常聪明的人创建了setuptools来取代它.他们合作并提出了entry_points/console_scripts机制作为可执行分发的标准,因此您不必考虑所有其他选项的问题.不要成为英雄.用你所得到的. (10认同)
  • 你能进一步解释“进口两次”吗?我的印象是“if __name__ == '__main__':'”是用来解决这个问题的? (2认同)

小智 13

这两种创建命令行可执行文件的方法之间的一个关键区别是,使用该setuptools方法(您的第一个示例),您必须在脚本内部调用一个函数 - 在您的情况下,这是func您的内部module.但是,在distutils方法(您的第二个示例)中,您可以直接调用脚本(允许使用或不使用扩展名列出).

  • 我认为这个答案错过了重点.entry_point方法是我们都应该使用的新方法.任何时候都有一个替代distutils功能的setuptools,这是一个很好的理由. (8认同)
  • 或者,似乎`scripts`是包含自定义脚本的唯一方法,例如WSGI脚本而不是命令行脚本.`entry_points`将始终生成某种命令行可执行文件.(这是否是一个好的想法,我不确定,但这是一个观察.) (4认同)

Kau*_*ose 7

设置工具入口点方法(#1)还具有以下优点:在Windows上将创建可以双击并像常规Windows程序一样调用的.exe.这是在类似posix的系统上将脚本放置在bin路径中的补充.


spa*_*her 5

另一个区别是,当使用 console_scripts 时,我的模块__init__文件被运行。当只使用脚本时,模块__init__不运行,只运行脚本。