1

私は単純なスケジューリングサービスを書いています。スケジュールできるすべてのタスクをハードコーディングするのではなく、フォルダーにドロップして実行時に動的にロードできるプラグインをサポートしたいと考えています。

私の計画は、タスク名を 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.pyimport dependencyPYTHONPATH

プラグイン自体に相対的なインポートを行うにはどうすればよいですか?

4

2 に答える 2

2

に追加できpathますsys.path

import sys
sys.path.append(path)

path、dependency.py を含むディレクトリです。

于 2012-09-09T02:13:30.827 に答える
1

があるpluginsディレクトリがある__init__.py場合は、そのディレクトリを に追加できますsys.path。次に、そこにあるモジュールでfrom . import dependency別のプラグインをインポートできます。または、プラグイン自体がサブパッケージである__init__.py場合(つまり、独自の. このセットアップでは、などを使用する必要さえありません。モジュール名で機能する関数を使用できます。from . import depfrom .. import depimp__import__

ただし、考えられる問題の 1 つは、プラグイン ディレクトリが「現在の作業ディレクトリの下」になると言うことです。それは正確にはどういう意味ですか?ドライブのどこにでもプラグインを追加して、引き続き使用できるようにしたいということですか? アプリの中心となるプラグイン ディレクトリを 1 つ作成し、それを に追加してsys.path、そこにプラグインを配置するよう人々に指示する方がよいでしょう。

于 2012-09-09T02:35:45.163 に答える