特定のネットワーク スキャン ツール (nmap、xprobe、p0f など) を指定するオプションをユーザーに提供し、そのツールを使用して特定のサブネットをスキャンするアプリケーションを作成しました (ツールを再実装せず、シェルで呼び出すだけです)。アプリの応答を解析します)、結果を解析し、特定の形式で DB に格納します。このアプリケーションは基本的に、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 プラットフォーム用)を使用して 1 つの実行可能ファイルにバンドルしようとすると、find_module と load_module で多くの問題が発生し、その結果、ImportError が発生します (実行可能ファイルでパスが正しく展開されていない可能性があります)。減圧)。
私の質問は - Python で同じ機能を実現できる別の方法はありますか (うまくいけば PyInstaller でうまくいくかもしれません)。
以前、PyInstaller での回避策を探してこの質問をしましたが、Python での回避策を探すことを余儀なくされた回答はありませんでした。