我的目标是动态加载我的不同子类并执行它们。要调用我的脚本,我正在使用它:
python Plugin.py Nmap execute google.com
或者
python Plugin.py Dig execute google.com
这是代码
父类:Plugin.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 / Nmap.py
中的子类class Nmap(Plugin):
def __init__(self):
self.sName = 'Nmap'
def execPlugin(self):
return 'something else'
位于Dig / Dig.py中的子类
class Dig(Plugin):
def __init__(self):
self.sName = 'Dig'
def execPlugin(self):
return 'yeahhh'
我的问题位于
oPlugin = mInstance()
出现以下错误
TypeError: 'module' object is not callable
我尝试了很多东西,但没有任何效果。我怎样才能解决我的问题?
答案 0 :(得分:1)
您的结构如下:
Plugin.py
/Nmap
__init__.py
Nmap.py
# class Nmap(Plugin): ...
在Plugin.py
中,当您mMod = __import__(sPlugin, fromlist=[sPlugin])
sPlugin == 'Nmap'
mMod
时,/Nmap
会引用目录Nmap.py
,不文件mInstance = getattr(mMod, sPlugin)
(请注意,文件和目录都可以是Python中的模块)。因此,mInstance
使Nmap.py
文件Nmap
而不是类__init__.py
。
有两种解决方法:
/Nmap
中的from Nmap import Nmap
将课程“up”升级一级,即包括getattr
;或Plugin.py
中添加额外级别的{{1}}。此外,您应遵循style guide's命名约定,这可能有助于您更快地跟踪问题。