在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 group。注意,如果多个其它不同的package利用mypacke.api.v1来注册entrypoint,那么我用mypackage.api.v1来访问entry point时,将会获取所有已注册过的entrypoint。
将该包install后,在本机上的任何程序可以利用以下几种方法调用该entry point方法一:使用pkg_resources类用调用
import pkg_resourcesdef 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_pointload_entry_point('mypackage', 'mypackage.api.v1', 'database')()方法三:利用stevedore
from stevedore import extensiondef 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')为什么需要entry point,直接用import调用不是一样吗?如果从单个package安装中看,的确与import没什么两样,但是,如果你有一个工具,需要调用所有已安装package的某一类接口,你是一个一个去import还是用entrypoint比较方便呢?当然是entry point了,将这一类的entrypoint注册到同一个group中,然后通过该group就可以调用所有的这类接口了。
eps1 = [ext.entry_point for ext in em1]