题
我已经阅读了 Pylons 和 Peak 页面上关于 Egg 入口点的文档,但我仍然不太明白。有人可以向我解释一下吗?
解决方案
“入口点”通常是一个开发者或您的Python包的用户可能希望使用,虽然非可调用对象可以作为入口点,以及可以提供的功能(或其它的可调用函数状物体) (评价为正确地指出!)。
在最流行的一种切入点是“console_script”的切入点,它指向你想提供一个命令行工具来安装任何人你的包的功能。该进入你的setup.py如下:
entry_points={
'console_scripts': [
'cursive = cursive.tools.cmd:cursive_command',
],
},
我有一个包,我刚才部署所谓的“cursive.tools”,我希望它是,提供一种“草书”命令的人可以在命令行中运行,如:
$ cursive --help
usage: cursive ...
要做到这一点的方法是定义一个函数,像草书/工具/ cmd.py也许“cursive_command”功能,看起来像:
def cursive_command():
args = sys.argv[1:]
if len(args) < 1:
print "usage: ..."
和等;应该认为它已经从命令行调用,分析用户已提供的参数,和...好,做任何的命令是专门做。
有关入口点使用的一个很好的例子安装 docutils的包:它将安装像半打有用的命令为Python文档转换为其他格式。
其他提示
入口点提供持久的,文件系统基于对象的名称注册和基于名称的直接对象导入机构(由 setuptools的封装中实现) 。
他们有关联的自由形式标识符Python对象的名称。因此,使用相同的Python安装并知道该标识符的任何其他代码可以与相关联的名称,不管该对象被定义访问对象。在相关联的名称可以是现有一个Python模块中的任何名称强>;一类,函数或变量的示例名称。入口点的机制不关心什么名字指的是,只要是可导入。
作为一个例子,让我们用(的名称)的功能,和一个虚蟒模块与一个完全合格的名称“myns.mypkg.mymodule”:
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查找属于一组(下面的例子)的所有入口点。
当一个包安装(即运行“蟒的setup.py安装”),上述声明由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),和检索的the_function那里定义,在呼叫到pkg_resources.load()。
假设有被同一组ID NO其它入口点的注册,然后调用the_function将是简单:
>>> named_objects['my_ep_func']()
hello from the_function
因此,虽然也许有点难以在第一把握,入口点机制实际上是使用很简单。它提供了用于可插拔的Python软件开发的有用工具。
从抽象的角度来看,入口点用于创建实现某些接口的 Python 可调用程序的系统范围注册表。pkg_resources 中有一些 API 可以查看给定包通告了哪些入口点,也有一些 API 可以确定哪些包通告了某个入口点。
入口点对于允许一个包使用另一包中的插件很有用。例如,伊恩·比金的 粘贴 项目广泛使用入口点。在这种情况下,您可以编写一个包,使用入口点来宣传其 WSGI 应用程序工厂 paste.app_factory
.
入口点的另一个用途是枚举系统上提供某些插件功能的所有包。这 涡轮齿轮 Web 框架使用 python.templating.engines
查找已安装且可用的模板库的入口点。