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

时间:2013-09-13 13:04:06

标签: python package setup.py

基本上有两种方法可以通过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

4 个答案:

答案 0 :(得分:35)

(真棒)点击包suggest a few reasons的文档使用入口点而不是脚本,包括

  1. 跨平台兼容性和
  2. 避免让解释器将__name__分配给__main__,这可能导致代码被导入两次(如果另一个模块导入您的脚本)
  3. Click是一种实现函数的好方法,可以用作entry_points,顺便说一句。

答案 1 :(得分:13)

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

答案 2 :(得分:6)

设置工具入口点方法(#1)也有the benefit,在Windows上将创建一个可以双击并像常规Windows程序一样调用的.exe文件。除了将脚本放置在类似posix的系统上的bin路径中之外。

答案 3 :(得分:0)

另一个区别是,当使用console_scripts时,我的模块的 init 文件已运行。仅使用脚本时,模块 init 未运行,只运行了脚本。