2010-06-15 10 views
6

Nie mogę wyświetlić wszystkich klas pochodnych za pomocą metody __subclasses__(). Oto mój układ katalogów:Python __subclasses __() nie wymienia podklas

import.py 
backends 
     __init__.py 
    --digger 
      __init__.py 
      base.py 
      test.py 
     --plugins 
       plugina_plugin.py 

Od import.py ja dzwonię test.py. test.py z kolei iteruje wszystkie pliki w katalogu plugins i ładuje je wszystkie. test.py wygląda następująco:

import os 
import sys 
import re 

sys.path.append(os.path.join(os.path.abspath(os.path.dirname(os.path.abspath(__file__))))) 
sys.path.append(os.path.join(os.path.abspath(os.path.dirname(os.path.abspath(__file__))), 'plugins')) 

from base import BasePlugin 

class TestImport: 
    def __init__(self): 
     print 'heeeeello' 

     PLUGIN_DIRECTORY = os.path.join(os.path.abspath(os.path.dirname(os.path.abspath(__file__))), 'plugins') 

     for filename in os.listdir (PLUGIN_DIRECTORY): 
      # Ignore subfolders 
      if os.path.isdir (os.path.join(PLUGIN_DIRECTORY, filename)): 
       continue 
      else: 
       if re.match(r".*?_plugin\.py$", filename): 
        print ('Initialising plugin : ' + filename) 
        __import__(re.sub(r".py", r"", filename)) 

     print ('Plugin system initialized') 
     print BasePlugin.__subclasses__() 

Problem nam, że metoda __subclasses__() nie wykazuje żadnych klas pochodnych. Wszystkie wtyczki w katalogu plugins pochodzą z klasy bazowej pliku base.py.

base.py wygląda następująco:

class BasePlugin(object): 
    """ 
    Base 
    """ 
    def __init__(self): 
     pass 

plugina_plugin.py wygląda następująco:

od bazowej importowej BasePlugin

class PluginA(BasePlugin): 
    """ 
    Plugin A 
    """ 
    def __init__(self): 
     pass 

Czy ktoś może mi pomóc z tym? Co robię źle? Wkurzyłem się o to, ale nie mogę tego rozgryźć.

Dzięki.

+0

Czy widzisz komunikat "Inicjalizacja wtyczki: plugina_plugin'? – unutbu

+0

Tak. Wyskakuje. Wygląda na to, że klasa jest nawet importowana, ale metoda '__subclasses__' nie wyświetla jej z jakiegoś powodu. –

+0

Nie udało mi się odtworzyć problemu. 'print BasePlugin .__ podklasy __()' daje '[]'.Być może, jeśli skopiujesz strukturę katalogów i będziesz dalej parował kod do jego najprostszej możliwej formy (przy każdej zmianie testowania, jeśli problem pozostanie), na pewnym etapie pośrednim znajdziesz wskazówkę co do źródła problemu. Na przykład, pozbyć się całego niepotrzebnego kodu w test.py, uprościć strukturę katalogów, pozbyć się import.py, etc ... – unutbu

Odpowiedz

4

Nie było żadnych innych plików base.py. Jestem na WinXP (SP2) z Pythonem 2.6. Do klasy PluginB dodałem kolejną klasę o nazwie PluginB, która posłużyła jako klasa podstawowa jako BasePlugin. Kiedy zrobiłem

print PluginA.__mro__ 
    print PluginB.__mro__ 

mam:

(<class 'plugina_plugin.PluginA'>, <class 'base.BasePlugin'>, <type 'object'>) 
(<class 'backends.digger.test.PluginB'>, <class 'backends.digger.base.BasePlugin'>, <type 'object'>) 

Jak widać, są one zarówno przy użyciu tego samego wtyczki bazową ale kwalifikowane nazwy są różne. To dlatego, że w plugina_plugin.py byłem importowania BasePlugin tak:

from base import BasePlugin 

Zamiast:

from backends.digger.base import BasePlugin 

Fixing to naprawił.

+0

Dziękujemy za przekopanie się przez ten numer! Kto by pomyślał, że obiekt o dwóch różnych kwalifikowanych nazwach ma dwa niezależne aliasy! – advait

0

Być może wtyczki znajdują gdzieś ukryte ukryte base.py (np. Katalog wtyczek).
Run z python -v aby sprawdzić, czy dwie różne base.py są coraz importowane

Można również spojrzeć na PluginA.__mro__ i potwierdzić, że BasePlugin tam jest właściwa

Powiązane problemy