Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/276.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 入口点/控制台脚本与setup.py中的脚本之间的差异?_Python_Package_Setup.py - Fatal编程技术网

Python 入口点/控制台脚本与setup.py中的脚本之间的差异?

Python 入口点/控制台脚本与setup.py中的脚本之间的差异?,python,package,setup.py,Python,Package,Setup.py,通过setup.py,基本上有两种方法将Python控制台脚本安装到我的路径: setup( ... entry_points = { 'console_scripts': [ 'foo = package.module:func', ], } ) 及 有什么区别?我看到第一种方法允许我为脚本选择好的、特定的名称,但是还有其他区别吗?不同的原始用途、兼容性(setuptools、distutils等?)、用法等。。

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

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

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


更新:自从我提出发布的问题以来。

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

安装工具入口点方法(#1)也有一种方法,即在windows上创建一个.exe,可以像普通windows程序一样双击和调用。这是除了在posix类系统上的bin路径中放置一个脚本之外的一项功能。

单击(awesome)包的文档使用入口点而不是脚本,包括

  • 跨平台兼容性和
  • 避免让解释器将
    \uuuuu name\uuuuu
    分配给
    \uuuuu main\uuuuuu
    ,这可能会导致代码导入两次(如果其他模块导入您的脚本)

  • 单击是实现用作
    入口点的函数的一种很好的方法。

    顺便说一句,还有一个区别是,在使用控制台脚本时,我的模块的init文件是运行的。仅使用脚本时,模块init未运行,仅运行脚本。

    这是正确答案。基本上,旧的distutils有很多问题。一群非常聪明的人创造了setuptools来取代它。他们合作提出了入口点/控制台脚本机制作为可执行文件分发的标准,因此您不必考虑所有其他选项的问题。不要做英雄。使用你所得到的。我想补充一点,自从我提出这个问题以来,这些很棒的文档出现了:不幸的是@HonzaJavorek-那些“很棒的文档”现在是404/不存在了:/它们存在了,只是结构发生了变化。新链接:你能进一步解释一下“导入两次”吗?我的印象是“if name=='main':'”是用来解决这个问题的?我认为这个答案没有抓住要点。切入点方法是我们都应该使用的新方法。无论何时,只要有一个setuptools替代distutils功能,这都是出于一个很好的理由。或者,
    scripts
    似乎是包含自定义脚本的唯一方法,例如WSGI脚本而不是命令行脚本<代码>入口点将始终生成某种类型的命令行可执行文件。(我不确定这是否是个好主意,但这是一个观察。)[update]链接断开了。我相信是替换(?)更新中的链接再次更新:修复了链接,谢谢!
    setup(
        ...
        scripts = [
            'scripts/myscript.sh'
        ]
    )