解释Python入口点?

时间:2009-04-21 21:59:55

标签: python setuptools

我已阅读有关Pylons和Peak页面上鸡蛋入口点的文档,我仍然不太懂。有人可以向我解释一下吗?

3 个答案:

答案 0 :(得分:176)

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()时检索了那里定义的函数。

假设同一组ID没有其他入口点注册,那么调用the_function将很简单:

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

因此,虽然起初可能有点难以理解,但入口点机制实际上非常简单易用。它为可插入的Python软件开发提供了一个有用的工具。

答案 1 :(得分:146)

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

最常用的入口点是“console_script”入口点,它指向您希望作为命令行工具提供给安装程序包的任何人的函数。这会进入你的setup.py,如:

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

我有一个我刚刚部署的名为“cursive.tools”的软件包,我想让它提供一个“草书”命令,有人可以从命令行运行,如:

$ cursive --help
usage: cursive ...

这样做的方法是定义一个函数,就像cursive / tools / cmd.py中的“cursive_command”函数看起来像:

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

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

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

答案 2 :(得分:16)

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

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

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