xiuxuan 发表于 2015-12-2 07:05:49

python entry points 例子

  pbr的介绍不多, http://ju.outofmemory.cn/entry/156745
  
  $ 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



def main():
print "this is databases main"
  
  $ cat mypackage/api/v1/hello.py



def main():
print "this is hello main"
  
  $ catsetup.cfg




name = mypackage
version = 12.0.0
summary = Cloud computing fabric controller

packages =
mypackage

mypackage.api.v1 =
databases = mypackage.api.v1.databases:main
hello = mypackage.api.v1.hello:main

universal = 1

autodoc_index_modules = 0
warnerrors = true
  $ cat setup.py



import setuptools
# 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:
  令贤的blog介绍 stevedore: http://blog.csdn.net/lynn_kong/article/details/9704413
  opensatck 社区介绍stevedore   http://docs.openstack.org/developer/stevedore/tutorial/index.html
  教程:https://github.com/openstack/stevedore/tree/master/doc/source/tutorial



from stevedore import extension
def test_detect_plugins():
em = extension.ExtensionManager('mypackage.api.v1')
names = sorted(em.names())
print names
em1 = extension.ExtensionManager('mypackage.api.v1')
eps1 = #plugin是被映射的函数,用于调用
em1 = extension.ExtensionManager('mypackage.api.v1')
eps1 =
  调用方法2:



import pkg_resources
def 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()
print plugin
type(plugin)
plugin(*argv)
  
  调用方法3:



from pkg_resources import load_entry_point
load_entry_point('mypackage', 'mypackage.api.v1', 'database')()
  
  在我的test 例子中需要导入pbr 才能工作,否则有些源代码打包不了。
  http://blog.oddbit.com/2014/09/27/integrating-custom-code-with-n/
  https://github.com/larsks/demo_nova_hooks
  没有导入pbr, 也可以, 需要研究。
  
页: [1]
查看完整版本: python entry points 例子