+-
python-动态加载模块,然后在加载的模块上使用“ from x import *”
我有一些 django应用,这些应用通过应用名称进行了版本控制.

appv1
appv2

应用程序中的models.py随版本而略有不同,但是具有相同的型号名称.

我正在尝试将模型动态加载到当前名称空间中.
所以我做了一个试图获取模块并返回它的函数:

def get_models_module(release):
    release_models_path = u"project.data_%s" % (release)
    _temp = __import__(release_models_path, globals(), locals(), ["models"], -1)
    models = _temp.models
    return models

然后,我尝试从返回的模型模块加载所有模型,但失败.

models = get_models_module("1")
from models import *

发生这种情况时,我得到了错误:

ImportError: No module named models

  

我检查了一下,并将返回的“模型”对象列为“模块’project.data_1.models’…”,
但显然,它不喜欢重命名.

有什么方法可以加载来自特定应用程序修订版的所有定义的模型?
还是有更好的方法来处理这种情况?

注意:目前,此功能仅在将数据获取到数据库的加载功能中使用,并且不会在任何视图中运行.

更新的解决方案:

感谢Daniel Kluev提供的解决方案,这是我的更新功能:

def load_release_models(release):
    model_release = release.replace(u".", u"_").replace(u"-", u"d") 
    release_models_path = u"project.data_%s.models" % (model_release)
    # import all release models into (global) namespace
    exec(u"from {0} import *".format(release_models_path)) in globals()

注意-由于需要访问整个文件中的这些模型,因此我正在加载全局变量.

最佳答案
在from models import *中,您未引用models变量.您只是在尝试导入名为“模型”的模块,该模块显然不存在.

您可以像这样使用hack将所有内容从模块导入当前的名称空间:

ldict = locals()
for k in models.__dict__:
    if not k.startswith('__') or not k.endswith('__'):
        ldict[k] = models.__dict__[k]

或者使用exec()加载模块,

exec("from project.data_{0}.models import *".format(release)) in locals()
点击查看更多相关文章

转载注明原文:python-动态加载模块,然后在加载的模块上使用“ from x import *” - 乐贴网