1

睡眠不足ですが、これが取れないのはばかげています。プラグインがあり、ロードされているのがわかりますが、メインファイルでインスタンス化できません。

from transformers.FOMIBaseClass import find_plugins, register
find_plugins()

これが私のFOMIBaseClassです:

from PluginBase import MountPoint
import sys
import os

class FOMIBaseClass(object):
    __metaclass__ = MountPoint

    def __init__(self):
        pass

    def init_plugins(self):
        pass

def find_plugins():
    plugin_dir = os.path.dirname(os.path.realpath(__file__))
    plugin_files = [x[:-3] for x in os.listdir(plugin_dir) if x.endswith("Transformer.py")]
    sys.path.insert(0, plugin_dir)
    for plugin in plugin_files:
        mod = __import__(plugin)

これが私のMountPointです:

class MountPoint(type):
    def __init__(cls,name,bases,attrs):
        if not hasattr(cls,'plugins'):
            cls.plugins = []
        else:
            cls.plugins.append(cls)

ロードされているのがわかります。

# /Users/carlos/Desktop/ws_working_folder/python/transformers/SctyDistTransformer.pyc matches /Users/carlos/Desktop/ws_working_folder/python/transformers/SctyDistTransformer.py
import SctyDistTransformer # precompiled from /Users/carlos/Desktop/ws_working_folder/python/transformers/SctyDistTransformer.pyc

しかし、私の人生では、メインファイルから「SctyDistTransformer」モジュールをインスタンス化することはできません。私は些細なことを見逃していることを知っています。基本的に、クラスローディングプラグインを採用したいと思います。

4

1 に答える 1

0

To dymically load Python modules from arbitrary folders use imp module:

http://docs.python.org/library/imp.html

Specifically the code should look like:

   mod = imp.load_source("MyModule", "MyModule.py")
   clz = getattr(mod, "MyClassName")

Also if you are building serious plug-in architecture I recommend using Python eggs and entry points:

http://wiki.pylonshq.com/display/pylonscookbook/Using+Entry+Points+to+Write+Plugins

https://github.com/miohtama/vvv/blob/master/vvv/main.py#L104

于 2012-08-08T11:39:25.273 に答える