Не знаю, в эту ветку или лучше в django, но все же:
Есть проект на джанго, в котором делаю автозагрузку плагинов из каталога. Структура каталогов такая:
mycms/
—- __init__.py
—- plugins
——– __init__.py
——– test.py
——– base.py
—- plugin_manager.py
в plugin_manager.py есть класс PluginManager, в __init__() которого я перебираю файлы из каталога plugins, пропуская __init__.py и base.py (в нем находится базовый класс для плагинов - baseplugin), после чего импортирую модули при помощи __import__()
После загрузки всех модулей, перебираю классы в каждом модуле и, если класс имеет базовым baseplugin, то добавляю его в список. Проблема в том, что проверка базового класса через issubclass(obj, plugins.base.baseplugin) не выполняется, т.к. baseplugin имеет полный путь <class ‘mycms.plugins.base.baseplugin’>, а базовый класс класса obj (проверяемого) - <class ‘plugins.base.baseplugin’>
Сам plugin_manager импортируется из urls.py в корне.
Можно ли как-то изменить импорт import plugins.base в plugin_manager, чтобы имя базового класса было не mycms.plugins.base.baseplugin, а plugins.base.baseplugin ?
plugin_manager.py
#-*- coding: utf-8 -*-
import os
import inspect
import sys
import plugins.base
plugin_dir = "plugins"
class PluginManager(object):
__plugins__ = []
def __init__(self):
modules = []
print "Load plugins..."
#загрузка модулей
for fname in os.listdir(plugin_dir):
if fname.endswith('.py'):
module_name = fname[:-3]
if module_name != "base" and module_name != "__init__" :
package_obj = __import__(plugin_dir+'.'+module_name)
modules.append(module_name)
#перебор классов модуля
for modulename in modules:
module_obj = getattr(package_obj, modulename)
for elem in dir(module_obj):
if elem == "baseplugin":
continue
if elem.startswith("__"):
continue
obj = getattr(module_obj, elem)
print plugins.base.baseplugin
if inspect.isclass(obj):
print obj
if issubclass(obj, plugins.base.baseplugin): # <------- здесь не проходит проверка
a = obj()
else:
print "--- Skipping ", elem, "class, not a plugin"
plug_man = PluginManager()
#-*- coding: utf-8 -*-
class baseplugin(object):
def __init__(self):
self.__name__ = __name__
pass
def load(self):
print ' -', self.__class__.__name__, 'loaded'
pass
def unload(self):
print ' -', self.__class__.__name__, 'unloaded'
pass
#-*- coding: utf-8 -*-
from base import baseplugin
class TestClass(baseplugin):
def load(self):
super(self.__class__, self).load()
pass
def unload(self):
super(self.__class__, self).unload()
pass