$ mkdir entry_test; cd entry_test; git init
$ mkdir -p mypackage/api/v1/
$ touch mypackage/__init__.py; touch mypackage/api/__init__.py; touch mypackage/api/v1/__init__.py;
$ tree mypackage
.
├── mypackage
│ ├── api
│ │ ├── __init__.py
│ │ └── v1
│ │ ├── databases.py
│ │ ├── hello.py
│ │ ├── __init__.py
│ ├── __init__.py
├── setup.cfg
└── setup.py
$ cat mypackage/api/v1/databases.py
defmain():print "this is databases main"
$ cat mypackage/api/v1/hello.py
defmain():print "this is hello main"
$ cat setup.cfg
[metadata]
name = mypackage
version = 12.0.0
summary = Cloud computing fabric controller
[files]
packages =
mypackage
[entry_points]
mypackage.api.v1 =
databases = mypackage.api.v1.databases:main
hello = mypackage.api.v1.hello:main
[wheel]
universal = 1
[pbr]
autodoc_index_modules = 0
warnerrors = true
$ cat setup.py
importsetuptools#In python < 2.7.4, a lazy loading of package `pbr` will break#setuptools if some other modules registered functions in `atexit`.#solution from: http://bugs.python.org/issue15881#msg170215
setuptools.setup(
name='mypackage',
packages=['mypackage'],
package_dir={'mypackage': 'mypackage'},
setup_requires=['pbr'],
pbr=True,
entry_points={'mypackage.api.v1':['databases=mypackage.api.v1.databases:main','hello=mypackage.api.v1.hello:main',
],
}
)
调用方法1:
from stevedore importextensiondeftest_detect_plugins():
em= extension.ExtensionManager('mypackage.api.v1')
names=sorted(em.names())printnames
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]
调用方法2:
importpkg_resourcesdef run_entry_point(*argv):
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()printplugin
type(plugin)
plugin(*argv)
调用方法3:
from pkg_resources importload_entry_point
load_entry_point('mypackage', 'mypackage.api.v1', 'database')()
在我的test 例子中需要导入pbr 才能工作,否则有些源代码打包不了。
没有导入pbr, 也可以, 需要研究。