我的目标是动态加载不同的子类并执行它们。要调用我的脚本,我使用以下命令:
python Plugin.py Nmap execute google.com
或者
python Plugin.py Dig execute google.com
这是密码
父类:插件.py
class Plugin(object)
def __init__(self):
self.sName = ''
def execPlugin(self):
return 'something'
def main():
# get the name of the plugin
sPlugin = sys.argv[1]
# create the object
mMod = __import__(sPlugin, fromlist=[sPlugin])
mInstance = getattr(mMod, sPlugin)
oPlugin = mInstance()
print oPlugin
print type(oPlugin)
if (sys.argv[2] == 'execute'):
# then execute it
return oPlugin.execPlugin(sys.argv[3])
if __name__ == '__main__':
main()
位于Nmap中的子类/平均每年
class Nmap(Plugin):
def __init__(self):
self.sName = 'Nmap'
def execPlugin(self):
return 'something else'
位于Dig的子类/挖.py
class Dig(Plugin):
def __init__(self):
self.sName = 'Dig'
def execPlugin(self):
return 'yeahhh'
我的问题出在
oPlugin = mInstance()
出现以下错误
TypeError: 'module' object is not callable
我试了很多东西,但都没用。我怎样才能解决我的问题?你知道吗
你的结构如下:
在
Plugin.py
中,当执行mMod = __import__(sPlugin, fromlist=[sPlugin])
其中sPlugin == 'Nmap'
时,这使得mMod
引用目录/Nmap
,而不是文件Nmap.py
(注意,文件和目录都可以是Python中的模块)。因此mInstance = getattr(mMod, sPlugin)
使mInstance
成为文件Nmap.py
,而不是类Nmap
。你知道吗有两种方法可以解决此问题:
/Nmap
中的__init__.py
将类提升一级,即包含from Nmap import Nmap
;或Plugin.py
中添加一个额外级别的getattr
。你知道吗此外,您应该遵循style guide's命名约定,这可能会帮助您更快地跟踪问题。你知道吗
相关问题 更多 >
编程相关推荐