私は単純なスケジューリングサービスを書いています。スケジュールできるすべてのタスクをハードコーディングするのではなく、フォルダーにドロップして実行時に動的にロードできるプラグインをサポートしたいと考えています。
私の計画は、タスク名を Python ファイル (モジュール) の場所にマップする JSON ファイル (または任意の構成ファイル) を用意することですPlugin
。かなり単純だと思いました。タスクの実行をスケジュールするときは、タスク名と実行時間を渡します。時間が経過すると、プラグインがロード (またはリロード) され、スケジューラに渡された追加の引数を使用して実行されます。
モジュールを調べてimp
、実行時にモジュールをロードする方法を確認しました。import
物理的な場所 (ファイル システム パス) を使用してプラグインを一覧表示するか、ステートメントに表示されるようにモジュール名を使用するかがわかりません。imp
物理的な場所を使用したいようです。
このコードの 2 つの異なるバージョンを「動作」させました。を使用するものは次のimportlib
とおりです。
pluginName = self.__pluginLookup[pluginName]
module = import_module(pluginName)
module = reload(module) # force reload
plugin = module.Plugin()
return plugin
これは私が使用して書いたものですimp
:
path = self.__pluginLookup[pluginName]
path, moduleName = split(path)
moduleName, extension = splitext(moduleName)
file, path, description = find_module(moduleName, [path])
with file:
module = load_module(moduleName, file, path, description)
plugin = module.Plugin()
return plugin
私が直面している問題は、依存関係の処理です。同じフォルダー内のファイルplugin.py
に依存するファイルがある場合、言ってもうまくいかないようです。代わりに、 から依存関係を検索します。dependency.py
import dependency
PYTHONPATH
プラグイン自体に相対的なインポートを行うにはどうすればよいですか?