有没有办法直接在层次结构中的指定模型下列出所有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)]
答案 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子模块。遗憾