Я написал приложение, которое дает пользователю возможность указать конкретный инструмент сетевого сканирования (скажем, nmap, xprobe, p0f), а затем сканирует данную подсеть с помощью этого инструмента (я не повторно реализую инструмент, просто вызываю это в оболочке и анализирует его ответ для моего приложения), анализирует результат и сохраняет в определенном формате в БД. Это приложение в основном приложение-фидер для другого приложения, которое будет использовать данные в БД.
Я написал свой код, чтобы все интерфейсы Scan Tool были реализованы в виде плагинов. Структура
Project/
DBWriter.py
Scanner/
__init__.py
network_mapper.py
Scanner.py
Plugins/
__init__.py
nmap.py
p0f.py
Others/
Таким образом, чтобы добавить новый интерфейс сканирования, все, что нужно сделать разработчику, это написать файл tool.py (в правильной семантике курса) и поместить его в папку плагинов.
Для этого мне нужно иметь возможность импортировать правильный модуль 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