我是靠谱客的博主 无奈雪碧,这篇文章主要介绍python学习心得(5)— Python插件化开发,现在分享给大家,希望可以做个参考。

前言

这年头,仅仅是硬编码的方式已经满足不了项目逇可拓展性,为了实现拓展的功能,考虑使用插件化加载功能来实现

参考

本文中的方法是import实现
以及参考开源python漏洞扫描器中的实现
https://github.com/Lcys/lcyscan
该扫描器通过加载不同的扫描模块,然后开启线程来实现

实现

废话少说,直接上代码

项目结构如下图:
这里写图片描述
定义了一个Plugins包,中间包含了两个插件Plugin1、Plugin2

复制代码
1
2
3
4
5
6
# Plugin1: class A(object): def __init__(self): pass def process(self): print('Plugin1')
复制代码
1
2
3
4
5
6
# Plugin2: class A(object): def __init__(self): pass def process(self): print('Plugin2')

实现的功能是动态加载这两个Plugin,并且调用其中的process方法

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# TestPlugin: import os # 找到Plugins中所有插件名称 def getPlugin(): path = os.path.split(os.path.realpath(__file__))[0] plugins = os.listdir(path + '/Plugins/') fil = lambda str: (True, False)[str[-3:] == 'pyc' or str.find('__init__.py') != -1] return filter(fil, plugins) if __name__ == "__main__": # 遍历所有插件 for plugin in getPlugin(): # Get Plugin File Name pluginName = os.path.splitext(plugin)[0] # Load Plugin plugin = __import__("Plugins." + pluginName, fromlist=[pluginName]) myplugin = getattr(plugin, "A") # Get Plugin Object p = myplugin() # Invoke Plugin Method p.process()

结果如下:
这里写图片描述

使用imp实现

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import imp import sys def __import__(name, globals=None, locals=None, fromlist=None): # Fast path: see if the module has already been imported. try: return sys.modules[name] except KeyError: pass # If any of the following calls raises an exception, # there's a problem we can't handle -- let the caller handle it. fp, pathname, description = imp.find_module(name) try: return imp.load_module(name, fp, pathname, description) finally: # Since we may exit via an exception, close fp explicitly. if fp: fp.close()

可以看出来,import由上述代码实现
根据上述代码,我们继续使用imp来实现,修改主方法如下

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
if __name__ == "__main__": PluginPath = os.getcwd() + '/Plugins/' sys.path.append(os.path.split(os.path.realpath(__file__))[0]) for plugin in getPlugin(): pluginName = os.path.splitext(plugin)[0] # Get Plugin File Name # plugin = __import__("Plugins." + pluginName, fromlist=[pluginName]) # Load Plugin # myplugin = getattr(plugin, "A") # p = myplugin() # Get Plugin Object # p.process() # Invoke Plugin Method/Plugins/' fp, pathname, description = imp.find_module(pluginName, [PluginPath]) try: m = imp.load_module(pluginName, fp, pathname, description) myplugin = getattr(m, "A") p=myplugin() p.process() except: pass

最后

以上就是无奈雪碧最近收集整理的关于python学习心得(5)— Python插件化开发的全部内容,更多相关python学习心得(5)—内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(73)

评论列表共有 0 条评论

立即
投稿
返回
顶部