Уведомления

Группа в Telegram: @pythonsu

#1 Авг. 16, 2011 15:20:06

mindinpanic
От:
Зарегистрирован: 2011-07-16
Сообщения: 8
Репутация: +  -1  -
Профиль   Отправить e-mail  

загадочный __import__

Здравствуйте!
Возникло непонимание поведения питона.
Я проектирую систему для парсинга логов 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'
плагины в директории plugins

при импортировании модуля manager.py код отрабатывает нормально,
а при запуске инициализируется только первый плагин.
Подскажите в чем может быть причина такого поведения.
Спасибо.



Офлайн

#2 Авг. 16, 2011 15:37:57

o7412369815963
От:
Зарегистрирован: 2009-06-17
Сообщения: 1986
Репутация: +  32  -
Профиль   Отправить e-mail  

Офлайн

#3 Авг. 16, 2011 16:09:15

mindinpanic
От:
Зарегистрирован: 2011-07-16
Сообщения: 8
Репутация: +  -1  -
Профиль   Отправить e-mail  

загадочный __import__

Поторопился с открытием темы(((
Проблема решилась выносом класса Plugin в отдельный файл.
Кто теперь объяснит почему?
Есть подозрение копать в сторону слабых ссылок…



Офлайн

#4 Авг. 16, 2011 17:02:03

o7412369815963
От:
Зарегистрирован: 2009-06-17
Сообщения: 1986
Репутация: +  32  -
Профиль   Отправить e-mail  

загадочный __import__

mindinpanic
Поторопился с открытием темы(((
Проблема решилась выносом класса Plugin в отдельный файл.
Кто теперь объяснит почему?
Есть подозрение копать в сторону слабых ссылок…
Вы запускали сам manager.py? Если запускаемый класс импортировать из других модулей, то он не будет синглтоном - будет создаваться новый модуль manager на каждый импорт, где у каждого свой класс Plugin, типа того…

Офлайн

#5 Авг. 16, 2011 18:00:10

mindinpanic
От:
Зарегистрирован: 2011-07-16
Сообщения: 8
Репутация: +  -1  -
Профиль   Отправить e-mail  

загадочный __import__

Да, сам manager.py. И получилось что manager импортировал модули которые импортировали manager.



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version