我已经阅读了Pylons和Peak页面中关于蛋入口点的文档,但我仍然不太明白。谁能给我解释一下吗?


当前回答

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

最流行的入口点是console_scripts入口点,它指向一个函数,您希望将其作为命令行工具提供给安装包的任何人。这将进入你的setup.py脚本,像这样:

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

我刚刚部署了一个名为cursive的包。工具,我想让它提供一个“草书”命令,人们可以从命令行运行,比如:

$ 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文档转换为其他格式。

其他回答

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

最流行的入口点是console_scripts入口点,它指向一个函数,您希望将其作为命令行工具提供给安装包的任何人。这将进入你的setup.py脚本,像这样:

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

我刚刚部署了一个名为cursive的包。工具,我想让它提供一个“草书”命令,人们可以从命令行运行,比如:

$ 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文档转换为其他格式。

从抽象的角度来看,入口点用于创建实现某些接口的Python可调用对象的系统级注册表。pkg_resources中有一些api用于查看给定包发布了哪些入口点,也有一些api用于确定哪些包发布了某个入口点。

入口点对于允许一个包使用另一个包中的插件非常有用。例如,Ian Bicking的Paste项目大量使用入口点。在这种情况下,您可以编写一个包,使用入口点paste.app_factory来发布它的WSGI应用程序工厂。

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

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的入口点下注册_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软件开发提供了一个有用的工具。