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


80

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

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

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

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

更新:自从我问了问题PyPA就此主题发布了这些很酷的文档


1
[更新]链接断开。我相信Packaging.python.org/distributing/#scripts是替代品(?)
马特·威尔基

1
是的,谢谢您的通知。我将更新更新:)
Honza Javorek '16

Answers:


46

(很棒的)Click软件包的文档提出了一些使用入口点而不是脚本的原因,包括

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

单击是实现用作entry_points,btw的功能的好方法。


10
这是正确的答案。基本上,旧的distutils存在很多问题。一群非常聪明的人创建了setuptools来代替它。他们进行了协作,并提出了entry_points / console_scripts机制作为可执行分发的标准,因此您不必考虑所有其他选项的问题。不要成为英雄。使用您得到的东西。
布鲁诺·布鲁诺斯基

我想补充一点,因为我问的问题,这些真棒文档出现了:python-packaging-user-guide.readthedocs.org/en/latest/...
洪扎Javorek

不幸的是,@ HonzaJavorek-这些“很棒的文档”现在是404 /不存在:/
Dan Dan

它们存在,只是结构发生了变化。新链接:python-packaging-user-guide.readthedocs.io/search/?
q=

2
您能否进一步解释“两次进口”?我的印象是,使用“ if name ==' main ':'”来解决此问题?
tribbloid '19

14

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


9
我认为这个答案错过了重点。entry_point方法是我们所有人都应该使用的新方法。每当有distutils功能的setuptools替代品时,这都是有充分理由的。
布鲁诺·布鲁诺斯基

4
另外,这似乎scripts是包括自定义脚本(例如WSGI脚本而不是命令行脚本)的唯一方法。entry_points总是会生成某种命令行可执行文件。(这不是一个主意,我不确定,但这是一个观察。)
jpmc26 2015年


2

另一个不同之处是,使用console_scripts时,模块的初始化文件已运行。仅使用脚本时,模块init并未运行,仅脚本已运行。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.