我编写了一个应用程序,让用户可以选择指定特定的网络扫描工具(例如 nmap、xprobe、p0f),然后使用该工具扫描给定的子网(我没有重新实现该工具,只需在 shell 中调用它并解析它对我的应用程序的响应),解析结果并以特定格式存储在 DB 中。这个应用程序基本上是另一个应用程序的馈送应用程序,它将使用数据库中的数据。
我编写了我的代码,以便所有扫描工具接口都作为插件实现。结构是
Project/
DBWriter.py
Scanner/
__init__.py
network_mapper.py
Scanner.py
Plugins/
__init__.py
nmap.py
p0f.py
Others/
因此,要添加新的扫描界面,开发人员只需编写一个 tool.py 文件(当然语义正确)并将其放入 Plugins 文件夹中。
为此,我需要能够在运行时导入正确的 python 模块。
from Plugins import nmap
or
from Plugins import xprobe
取决于用户输入的内容
这是我添加的代码
f,p,d = imp.find_module("Plugins")
x = imp.load_module("Plugins",f,p,d)
path_n = x.__path__
f,p,d = imp.find_module("%s"%(tool),path_n)
tool_mod = imp.load_module("%s"%(tool),f,p,d)
tool_mod.scan() #Irrespective of what user enters or what new plugin is developed, this line does not need to change and will work as long as plug-in has a scan function
代码正常工作。但是,当我尝试使用PyInstaller(对于 Windows/*Nix 平台)将它捆绑到一个可执行文件中时,它在 find_module 和 load_module 中有很多麻烦,因此我得到一个 ImportError (可能是因为路径没有在可执行文件中正确展开减压)。
我的问题是 - 在 Python 中是否有另一种方法可以使用它来实现相同的功能(可能希望与 PyInstaller 一起工作)?
我之前曾问过这个问题,在 PyInstaller 中寻找解决方法,但没有任何回应迫使我在 Python 中寻找解决方法