【问题标题】:Dynamic Loading of Modules then using "from x import *" on loaded module动态加载模块,然后在加载的模块上使用“from x import *”
【发布时间】:2010-07-30 14:21:28
【问题描述】:

我有一些按应用名称进行版本控制的 django 应用。

appv1 应用v2

应用中的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: 没有名为模型的模块

我检查了返回的“models”对象列为“module '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()

注意 - 我正在加载全局变量,因为我需要在整个文件中访问这些模型。

【问题讨论】:

    标签: python django import


    【解决方案1】:

    from models import *,您指的不是models 变量。您只是想导入名为“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()
    

    【讨论】:

      猜你喜欢
      • 2012-11-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-27
      • 2019-08-25
      • 1970-01-01
      • 2010-10-20
      相关资源
      最近更新 更多