python-基础-entrypoints
entry points
package通过setuptools注册的一个外部可以直接调用的接口;
在mypackage的setup.py里注册entry_points如下
setup(                                                             
    name='mypackage',                                                   
    entry_points={                                                  
       'mypackage.api.v1':[                                              
          'databases=mypackage.api.v1.databases:main',                  
           ],                                                      
 ) 
setup()函数注册了一个entry point,属于mypackage.api.v1组
方便之处:
如果多个package利用mypacke.api.v1注册entrypoint,那么用mypacke.api.v1访问entrypoint时,将会获得所有已注册过的entrypoint
将包install后,本机程序如何调用entry point
方法一
pkg_resources类调用
import pkg_resources
def run_entry_point(data):
    group = 'mypackage.api.v1'
    for entrypoint in pkg_resources.iter_entry_points(group=group):
        # Grab the function that is the actual plugin.
        plugin = entrypoint.load()
        plugin(data)
方法二
from pkg_resources import load_entry_point
load_entry_point('mypackage', 'mypackage.api.v1', 'database')()
方法三
利用stevedore
from stevedore import extension
def test_detect_plugins():
    em = extension.ExtensionManager('mypackage.api.v1')
    names = sorted(em.names())
    assert names == ['t1', 't2']
    em1 = extension.ExtensionManager('mypackage.api.v1')
    eps1 = [ext.plugin for ext in em1]  #plugin是被映射的函数,用于调用
    em1 = extension.ExtensionManager('mypackage.api.v1')
    eps1 = [ext.entry_point for ext in em1]
为何需要entry point而不是import
单个package和import没有区别,如果需要调用所有已安装package的某一类接口,entrypoint更为方便;
将这一类entrypoint注册到同一group中,然后通过该group就可以调用所有这类接口;
最常用的是console_script
安装之后的一系列命令行工具
entry_points={
    'console_scripts': [
        'cursive = cursive.tools.cmd:cursive_command',
    ],
},
如果想在终端中输出下面内容
$ cursive --help
usage: cursive ...
方法是在cursive/tools/cmd.py定义一个函数
def cursive_command():
    args = sys.argv[1:]
    if len(args) < 1:
        print "usage: ..."
 
                     
                    
                 
                    
                
 
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号