動的クラスを増やす目標を揚げており、Python2.6:RuntimeWarning:親モジュール'plugins'見つかりませんで取り扱いながらさまざまな絶対的に輸入

StackOverflow https://stackoverflow.com/questions/2267984

質問

また、プラグインシステムがプラグインモジュールをロードのようになります:

def load_plugins():
   plugins=glob.glob("plugins/*.py")
   instances=[]
   for p in plugins:
      try:
         name=p.split("/")[-1]
         name=name.split(".py")[0]
         log.debug("Possible plugin: %s", name)
         f, file, desc=imp.find_module(name, ["plugins"])
         plugin=imp.load_module('plugins.'+name, f, file, desc)
         getattr(plugin, "__init__")(log)
         instances=instances+plugin.get_instances()
      except Exception as e:
         log.info("Failed to load plugin: "+str(p))
         log.info("Error: %s " % (e))
         log.info(traceback.format_exc(e))
   return instances

このコードの作品が各import文のプラグインのコードを取得しますこのような警告:

plugins/plugin.py:2: RuntimeWarning: Parent module 'plugins' not found while handling absolute import
  import os

なエラー報告のためのプログラムコードのプラグインです。

できるかという警告するとと思って間違っています。または空のプラグインモジュールを個別にインポートしくはpython---"嬉しい"???

役に立ちましたか?

解決

の場合はディレクトリ plugins したパッケージ含まれる __init__.py 細い)、簡単に利用pkgutils列挙そのプラグインファイルおよび負荷します。

import pkgutil
# import our package
import plugins
list(pkgutil.iter_modules(plugins.__path__))

しかし、その場その場でなく、プラグインのパッケージもしてみてください:

import pkgutil
list(pkgutil.iter_modules(["plugins"]))

ものを作ることが可能なパッケージのみが存在するのでランタイム:

import types
import sys
plugins = types.ModuleType("plugins")
plugins.__path__ = ["plugins"]

sys.modules["plugins"] = plugins
import plugins.testplugin

しかしこのハッキングをほとんどのための楽しい!

他のヒント

場合にpluginsディレクトリを持たない __init__.py, なパッケージで作成する場合 plugins.whatever, Pythonを警告するようになっ存在します。(見ながら作成した"import plugins.whatever"どのようなパスです。)

また、

  • ない分割 /, るunportable.使用 os.path.split.
  • 使用しない .split(".py") の名で拡張子なしの、バギー.使用 os.path.splitext.
  • 使用しない getattr 文字列リテラルです。 getattr(plugin, "__init__")plugin.__init__.
  • 戸惑った理由を呼び出すモジュールレベル __init__ 機能です。このように見えません。もしかしたい"set_logger"機能や、インスタンスを生成するクラスを取るlogger.
  • 使用しない L = L + some_other_list このリストをご利用 extend 法による性能は慣用句.
  • わからないなスカッシュの未知の例外 except Exception.できない場合はプランになcodeに対応し、例外プログラムという逆説的な状況になっていsanely.

問題は、ド('.') のモジュール名:

imp.load_module('plugins.'+name, f, file, desc)

含めないでくださいa'.'の後のプラグインやPython考えるようになることでモジュールのパスです。

きみを加え以下の書初の輸入に関す

from __future__ import absolute_import

Python imp 文書を更新しまして回答しました。今のままで、この問題を解決具体的には、 find_module() 方法。

この機能を取扱うことはありませんの階層的モジュールの名前(名を含むドット).見出すために P.M, では、サブモジュール M パッケージ P, -利用 find_module()load_module() 見荷重パッケージ P, その利用 find_module()パス 引数に設定 P.__path__.時 P があり、それぞれが点在の名前、このレシピを再帰的に.

ご注意 P.__path__ 既にリストが提供で find_module().もう find_module() 文書"という発見はパッケージ。

場合にはモジュールはパッケージには、 ファイルNone, パス名 はパッケージのパスの最後の項目 説明 タプル PKG_DIRECTORY.

からOPの問題をインポートするにはプラグインなし RuntimeError 警告、方法の更新をPythonドキュメンテーション

# first find and load the package assuming it is in
# the current working directory, '.'

f, file, desc = imp.find_module('plugins', ['.'])
pkg = imp.load_module('plugins', f, file, desc)

# then find the named plugin module using pkg.__path__
# and load the module using the dotted name

f, file, desc = imp.find_module(name, pkg.__path__)
plugin = imp.load_module('plugins.' + name, f, file, desc)
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top