我编写了一个应用程序,为用户提供了指定特定网络扫描工具(比如nmap,xprobe,p0f)的选项,然后用该工具扫描给定的子网(我没有重新实现该工具,只需调用它在shell中并解析其对我的app的响应),解析结果并以特定格式存储在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中寻找变通方法
答案 0 :(得分:0)
如果您只需要在Windows上运行,那么我建议您尝试py2exe。
py2exe是一个Python Distutils扩展,它将Python脚本转换为可执行的Windows程序,无需安装Python即可运行。
我们在工作中使用它来加速非常大的Python程序,并且它可以处理导入的模块。