有没有办法让所有模块都在层次结构中的特定模块下?

时间:2011-07-31 13:59:19

标签: python django introspection

有没有办法直接在层次结构中的指定模型下列出所有python模块?

我有一个慢慢增长的Django网络应用程序,我根据这篇文章重新组织了它:

http://paltman.com/2008/01/29/breaking-apart-models-in-django/

但是,我试图通过在模块初始化文件(__ init __.py)中使用内省来改进他的技术,以便在下级作业中自动检测Django模型类的所有实例。我已经得到了这种功能,但它仍然需要在它上面的树中的静态模块列表才能工作。

如果人们感兴趣,这就是我的解决方案:

from django.db.models.base import ModelBase
from sys import modules

moduleList = ['TechTree', 'PilotAbilities']
__all__ = []

for moduleName in moduleList:
  fullyQualifiedModuleName = '%s.%s' % (__name__, moduleName)
  moduleObj = __import__(fullyQualifiedModuleName)

  __all__ += [item for item in dir(moduleObj) if isinstance(getattr(moduleObj, item), ModelBase)]

2 个答案:

答案 0 :(得分:1)

好吧,您可以获得os.path.dirname(parent.__file__),然后glob.glob()os.walk()并查找其他 init .py文件。

答案 1 :(得分:1)

这只是一次尝试,但似乎有效。我正在运行python 2.7.1和dir(somemodule)给了我所有相关的模块。使用openpyxl和os模块进行测试。

def import_all(name):
    __import__(name)
    for i in dir(name):
        try:
            if type(i) == type(name):
                import_all(name+'.'+i)
        except:
            pass

注意: 这可能是非常不敏感和气馁,但似乎有效。

注2: 那是因为我不小心有'openpyxl'(我正在使用的测试)而不是list子模块。遗憾