def _init_plugins(self, plugindir, plugins_to_load=None):
if plugindir and not os.path.isdir(plugindir):
raise InvalidPluginDir(plugindir)
if not plugindir:
plugindir = DIR("plugins")
logger.debug("plugindir: {0}".format(plugindir))
if os.path.isdir(plugindir):
pluginfiles = glob(os.path.join(plugindir, "[!_]*.py"))
plugins = strip_extension(os.path.basename(p) for p in pluginfiles)
else:
# we might be in an egg; try to get the files that way
logger.debug("trying pkg_resources")
import pkg_resources
try:
plugins = strip_extension(
pkg_resources.resource_listdir(__name__, "plugins"))
except OSError:
raise InvalidPluginDir(plugindir)
hooks = {}
oldpath = copy.deepcopy(sys.path)
sys.path.insert(0, plugindir)
for plugin in plugins:
if plugins_to_load and plugin not in plugins_to_load:
logger.debug("skipping plugin {0}, not in plugins_to_load {1}".format(plugin, plugins_to_load))
continue
logger.debug("plugin: {0}".format(plugin))
try:
mod = importlib.import_module(plugin)
modname = mod.__name__
for hook in re.findall("on_(\w+)", " ".join(dir(mod))):
hookfun = getattr(mod, "on_" + hook)
logger.debug("plugin: attaching %s hook for %s", hook, modname)
hooks.setdefault(hook, []).append(hookfun)
if mod.__doc__:
# firstline = mod.__doc__.split('\n')[0]
part_attachment = json.loads(mod.__doc__)
hooks.setdefault('help', {})[modname] = part_attachment
hooks.setdefault('extendedhelp', {})[modname] = mod.__doc__
# bare except, because the modules could raise any number of errors
# on import, and we want them not to kill our server
except:
logger.warning("import failed on module {0}, module not loaded".format(plugin))
logger.warning("{0}".format(sys.exc_info()[0]))
logger.warning("{0}".format(traceback.format_exc()))
sys.path = oldpath
return hooks
评论列表
文章目录