94

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

setup(
    ...
    entry_points = {
        'console_scripts': [
            'foo = package.module:func',
        ],
    }
)

setup(
    ...
    scripts = [
        'scripts/myscript.sh'
    ]
)

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

更新:既然我问了这个问题PyPA发布了关于该主题的这些很酷的文档

4

4 回答 4

57

(awesome) Click 包的文档提出了一些使用入口点而不是脚本的理由,包括

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

Click 是实现用作 as 的函数的好方法entry_points,顺便说一句。

于 2015-01-23T22:25:20.627 回答
15

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

于 2013-09-24T15:28:21.630 回答
9

安装工具入口点方法 (#1) 还具有在 Windows 上创建 .exe的好处,该 exe 可以像常规 Windows 程序一样双击和调用。这是在类 posix 系统上将脚本放置在 bin 路径中的补充。

于 2014-11-23T01:46:57.823 回答
4

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

于 2017-10-20T18:25:21.503 回答