6

プラグインをロードできる Python アプリケーションを作成しました。これらのプラグインは、名前とパスに基づいてロードされます。

私は現在使用しています

pluginModule = imp.load_source(pluginModuleName,  pluginModulePath)

そして、この方法でモジュール内のクラスインスタンスを取得します

# Load the module class and initialize it.
if hasattr(pluginModule, pluginClassName):
  try:
    pluginClassInst = getattr(pluginModule, pluginClassName)()
  except Exception as e:
    errorMsg = ('In plugin module [{}], {}'.format(os.path.basename(pluginModulePath), e))
    exceptionTracePrint(self._log)
    self._log.error(errorMsg)
    continue

imp lib は廃止されたので、importlib を使用したいと思います。そして、私のクラスインスタンスを取得する唯一の同様の方法は、使用することでした

pluginModule = importlib.machinery.SourceFileLoader(pluginModuleName, pluginModulePath).load_module()

ここで奇妙なのは(私はpyCharmをIDEとして使用しています)ということです。コードをデバッグ モードで実行すると、上記のコマンドが正常に機能し、クラス インスタンスが取得されます。ただし、通常、コードを実行すると、次のエラーが発生します。

pluginModule = importlib.machinery.SourceFileLoader(pluginModuleName, pluginModulePath).load_module()
AttributeError: 'module' object has no attribute 'machinery'

実行とデバッグに違いがあるのはなぜですか。私がやりたいことを行う別の方法はありますか?

私も試してみました

pluginModuleTmp = importlib.util.spec_from_file_location(pluginModuleName, pluginModulePath)

これも正しいデータを提供しますが、この方法でモジュールをロードできないか、少なくとも方法がわかりません

よろしくアンダース

4

1 に答える 1