Форум сайта python.su
Здравствуйте!
Возникло непонимание поведения питона.
Я проектирую систему для парсинга логов Exim с поддержкой плагинов.
За основу был взят пример из книги “Pro Python System Administration”.
В чем, собственно, проблема:
есть код менеджера плагинов в файле manager.py
# -*- coding: utf-8 -*-
import sys
import os
class Plugin(object):
pass
class PluginManager():
def __init__(self, path=None, plugin_init_args={}):
if path:
self.plugin_dir = path
else:
self.plugin_dir = os.path.join(os.path.abspath(os.path.dirname(__file__)), 'plugins')
self.plugins = {}
self._load_plugins()
self._register_plugins(**plugin_init_args)
def _load_plugins(self):
sys.path.append(self.plugin_dir)
plugin_files = [fn for fn in os.listdir(self.plugin_dir) if fn.startswith('plugin_') and fn.endswith('.py')]
plugin_modules = [m.split('.')[0] for m in plugin_files]
for module in plugin_modules:
m = __import__(module)
def _register_plugins(self, **kwargs):
for plugin in Plugin.__subclasses__():
obj = plugin(**kwargs)
plugin_manager = PluginManager()
# -*- coding: utf-8 -*-
from manager import Plugin
class TestPlugin(Plugin):
def __init__(self):
print 'Test plugin'
# -*- coding: utf-8 -*-
from manager import Plugin
class OtherTestPlugin(Plugin):
def __init__(self):
print 'Other Test plugin'
Офлайн
Офлайн
Поторопился с открытием темы(((
Проблема решилась выносом класса Plugin в отдельный файл.
Кто теперь объяснит почему?
Есть подозрение копать в сторону слабых ссылок…
Офлайн
mindinpanicВы запускали сам manager.py? Если запускаемый класс импортировать из других модулей, то он не будет синглтоном - будет создаваться новый модуль manager на каждый импорт, где у каждого свой класс Plugin, типа того…
Поторопился с открытием темы(((
Проблема решилась выносом класса Plugin в отдельный файл.
Кто теперь объяснит почему?
Есть подозрение копать в сторону слабых ссылок…
Офлайн
Да, сам manager.py. И получилось что manager импортировал модули которые импортировали manager.
Офлайн