235

我已经阅读了 Pylons 和 Peak 页面上关于 egg 入口点的文档,但我仍然不太明白。有人可以向我解释吗?

4

3 回答 3

230

“入口点”通常是 Python 包的开发人员或用户可能想要使用的函数(或其他可调用的类似函数的对象),尽管也可以提供不可调用的对象作为入口点(同样正确)在评论中指出!)。

最流行的入口点类型是console_scripts入口点,它指向您希望作为命令行工具提供给安装您的包的​​任何人的功能。这进入你的setup.py脚本,如:

entry_points={
    'console_scripts': [
        'cursive = cursive.tools.cmd:cursive_command',
    ],
},

我有一个我刚刚部署的名为 的包cursive.tools,我希望它能够提供一个可以从命令行运行的“草书”命令,例如:

$ cursive --help
usage: cursive ...

这样做的方法是定义一个函数,比如cursive_command文件cursive/tools/cmd.py中的一个函数,如下所示:

def cursive_command():
    args = sys.argv[1:]
    if len(args) < 1:
        print "usage: ..."

等等;它应该假设它是从命令行调用的,解析用户提供的参数,并且......好吧,做任何命令被设计做的事情。

安装该docutils软件包以获得一个很好的入口点使用示例:它将安装一些类似六个有用的命令,用于将 Python 文档转换为其他格式。

于 2009-04-23T18:37:08.280 回答
207

EntryPoints提供持久的、基于文件系统的对象名称注册和基于名称的直接对象导入机制(由setuptools包实现)。

它们将 Python 对象的名称与自由格式的标识符相关联。因此,任何其他使用相同 Python 安装并知道标识符的代码都可以访问具有关联名称的对象,而不管对象是在哪里定义的。关联名称可以是 Python 模块中存在的任何名称;例如类、函数或变量的名称。入口点机制不关心名称指的是什么,只要它是可导入的。

例如,让我们使用一个函数(名称)和一个具有完全限定名称“myns.mypkg.mymodule”的假想 python 模块:

def the_function():
   "function whose name is 'the_function', in 'mymodule' module"
   print "hello from the_function"

入口点通过 setup.py 中的入口点声明进行注册。在名为“my_ep_func”的入口点下注册 the_function:

    entry_points = {
        'my_ep_group_id': [
            'my_ep_func = myns.mypkg.mymodule:the_function'
        ]
    },

如示例所示,入口点是分组的;有相应的 API 来查找属于一个组的所有入口点(下面的示例)。

在安装包时(即运行“python setup.py install”),上述声明由 setuptools 解析。然后它将解析的信息写入特殊文件。之后,可以使用pkg_resources API(setuptools 的一部分)查找入口点并访问具有关联名称的对象:

import pkg_resources

named_objects = {}
for ep in pkg_resources.iter_entry_points(group='my_ep_group_id'):
   named_objects.update({ep.name: ep.load()})

在这里,setuptools 读取写入特殊文件的入口点信息。它找到入口点,导入模块 (myns.mypkg.mymodule),并在调用 pkg_resources.load() 时检索在那里定义的_function。

调用 the_function 就很简单了:

>>> named_objects['my_ep_func']()
hello from the_function

因此,虽然一开始可能有点难以掌握,但入口点机制实际上非常易于使用。它为可插拔的 Python 软件开发提供了一个有用的工具。

于 2012-03-08T09:39:04.107 回答
19

从抽象的角度来看,入口点用于创建实现某些接口的 Python 可调用函数的系统范围注册表。pkg_resources 中有 API 可以查看给定包通告了哪些入口点,也有 API 可以确定哪些包通告了某个入口点。

入口点对于允许一个包使用另一个包中的插件很有用。例如,Ian Bicking 的Paste项目广泛使用入口点。在这种情况下,您可以编写一个包,使用入口点来宣传其 WSGI 应用程序工厂paste.app_factory

入口点的另一个用途是枚举系统上提供一些插件功能的所有包。TurboGears Web 框架使用python.templating.engines入口点来查找已安装且可用的模板库 。

于 2009-04-21T22:10:16.017 回答