Найти - Пользователи
Полная версия: загадочный __import__
Начало » Python для новичков » загадочный __import__
1
mindinpanic
Здравствуйте!
Возникло непонимание поведения питона.
Я проектирую систему для парсинга логов 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 код отрабатывает нормально,
а при запуске инициализируется только первый плагин.
Подскажите в чем может быть причина такого поведения.
Спасибо.
o7412369815963
может оно?
http://stackoverflow.com/questions/3048337/python-subclasses-not-listing-subclasses
mindinpanic
Поторопился с открытием темы(((
Проблема решилась выносом класса Plugin в отдельный файл.
Кто теперь объяснит почему?
Есть подозрение копать в сторону слабых ссылок…
o7412369815963
mindinpanic
Поторопился с открытием темы(((
Проблема решилась выносом класса Plugin в отдельный файл.
Кто теперь объяснит почему?
Есть подозрение копать в сторону слабых ссылок…
Вы запускали сам manager.py? Если запускаемый класс импортировать из других модулей, то он не будет синглтоном - будет создаваться новый модуль manager на каждый импорт, где у каждого свой класс Plugin, типа того…
mindinpanic
Да, сам manager.py. И получилось что manager импортировал модули которые импортировали manager.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB