解释Python的入口点?

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

一个“入口点”通常是你的Python包的开发者或用户可能想要使用的一个函数(或其他可调用类函数的对象),尽pipe也可以提供一个不可调用的对象作为入口点在评论中指出!)。

最stream行的入口点是“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: ..." 

等等; 它应该假设它是从命令行调用的,parsing用户提供的参数,以及…做好所有命令的devise。

安装docutils软件包是入门点使用的一个很好的例子:它将安装类似于将Python文档转换为其他格式的六种有用命令。

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

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

作为一个例子,让我们使用一个函数的名字(一个名字为“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')时,上面的声明被setuptoolsparsing。 然后将parsing的信息写入特殊文件。 之后,可以使用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读取用特殊文件写入的入口点信息。 它find了入口点,导入了模块(myns.mypkg.mymodule),并在调用pkg_resources.load()时检索到定义的函数。

假设没有其他入口点注册相同的组ID,调用the_function将是很简单的:

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

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

从抽象的angular度来看,入口点被用来创build一个实现某些接口的Python可调用的系统范围的registry。 pkg_resources中有一些API可以查看给定包通告了哪些入口点,以及API来确定哪些包通告某个入口点。

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

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