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

要从任意文件夹动态加载 Python 模块,请使用 imp 模块:

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

具体而言,代码应如下所示:

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

此外,如果您正在构建严肃的插件架构,我建议使用 Python 鸡蛋和入口点:

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 回答