有没有一种方法可以通过字符串从模块导入*(全部)?

时间:2020-02-17 14:30:38

标签: python

我正在尝试创建一个动态定义的设置对象,通常您会使用该格式

base_settings.py

MY_VAR = 1

my_settings.py

from base_settings import *
assert MY_VAR == 1

但是,在这种情况下,我希望base_settings是一个字符串,它定义了通往不同设置模块的路径。例如,我可能还有其他基本设置文件:

base_settings1.py

MY_VAR = 1

base_settings2.py

MY_VAR = 2

my_settings.py

import os
base_settings = os.environment['SETTINGS_MODULE']  # This is "base_settings2" for the example
from magic(base_settings) import *
assert MY_VAR == 2

我知道您可以使用importlib.import_module(path)进行导入,但是这会将导入的代码返回到特定变量中,而不是“爆炸”到具有原始变量名称的导入文件中。

1 个答案:

答案 0 :(得分:1)

您可以修改locals命名空间,尽管实际上不建议这样做:

mod_name = os.environment['SETTINGS_MODULE']
locals().update({
    k: v for k, v in importlib.import_module(mod_name).__dict__.items() 
    if not k.startswith('_')
})

这会将添加到您的本地(模块)变量的设置模块中找到的变量。

但是,建议您将对话保持在封闭状态。