Python: получение дескриптора для импортированных модулей - PullRequest
1 голос
/ 17 октября 2011

Я написал приложение, которое дает пользователю возможность указать конкретный инструмент сетевого сканирования (скажем, 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

1 Ответ

0 голосов
/ 17 октября 2011

Если вам нужно работать только в Windows, я рекомендую попробовать py2exe .

py2exe - расширение Python Distutils, которое преобразует скрипты Python в исполняемые программы Windows, способныезапускать без установки Python.

Мы используем его на работе, чтобы ускорить очень большую программу Python, и она справляется с импортированными модулями.

...