我似乎无法使用__subclasses__()
方法列出所有派生类。这是我的目录布局:
import.py
backends
__init__.py
--digger
__init__.py
base.py
test.py
--plugins
plugina_plugin.py
来自import.py
我正在呼叫test.py
。 test.py
依次遍历plugins
目录中的所有文件并加载所有文件。 test.py
看起来像这样:
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__()
问题是__subclasses__()
方法没有显示任何派生类。 plugins
目录中的所有插件都派生自base.py
文件中的基类。
base.py
看起来像这样:
class BasePlugin(object):
"""
Base
"""
def __init__(self):
pass
plugina_plugin.py
看起来像这样:
来自基础导入BasePlugin
class PluginA(BasePlugin):
"""
Plugin A
"""
def __init__(self):
pass
有人可以帮我解决这个问题吗?我做错了什么?我绞尽脑汁但我似乎无法弄清楚
感谢。
答案 0 :(得分:7)
没有其他base.py文件。我使用的是Python 2.6的WinXP(SP2)。我在名为test.py
的{{1}}文件中添加了另一个类,该文件使用PluginB
作为基类。当我做的时候
BasePlugin
我得到了:
print PluginA.__mro__
print PluginB.__mro__
如您所见,他们都使用相同的基本插件,但限定名称不同。这是因为在(<class 'plugina_plugin.PluginA'>, <class 'base.BasePlugin'>, <type 'object'>)
(<class 'backends.digger.test.PluginB'>, <class 'backends.digger.base.BasePlugin'>, <type 'object'>)
我正在导入plugina_plugin.py
,如下所示:
BasePlugin
而不是:
from base import BasePlugin
解决这个问题。
答案 1 :(得分:0)
也许插件正在寻找隐藏在某处的另一个base.py
(例如插件目录)
使用python -v
运行,看看是否有两个不同的base.py
正在导入
您还可以查看PluginA.__mro__
并确认其中的BasePlugin
是否正确