動的クラスを増やす目標を揚げており、Python2.6:RuntimeWarning:親モジュール'plugins'見つかりませんで取り扱いながらさまざまな絶対的に輸入
-
20-09-2019 - |
質問
また、プラグインシステムがプラグインモジュールをロードのようになります:
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)