Python:如何动态地从模块导入所有方法和属性

sun*_*nce 17 python python-import python-2.7 python-importlib

我想动态加载一个模块,给出它的字符串名称(来自环境变量).我正在使用Python 2.7.我知道我可以这样做:

import os, importlib
my_module = importlib.import_module(os.environ.get('SETTINGS_MODULE'))
Run Code Online (Sandbox Code Playgroud)

这大致相当于

import my_settings
Run Code Online (Sandbox Code Playgroud)

(哪里SETTINGS_MODULE = 'my_settings').问题是,我需要相当于的东西

from my_settings import *
Run Code Online (Sandbox Code Playgroud)

因为我希望能够访问模块中的所有方法和变量.我试过了

import os, importlib
my_module = importlib.import_module(os.environ.get('SETTINGS_MODULE'))
from my_module import *
Run Code Online (Sandbox Code Playgroud)

但我得到了一堆错误.有没有办法在Python 2.7中动态导入模块的所有方法和属性?

Bre*_*arn 17

如果您有模块对象,则可以模仿逻辑import *用法,如下所示:

module_dict = my_module.__dict__
try:
    to_import = my_module.__all__
except AttributeError:
    to_import = [name for name in module_dict if not name.startswith('_')]
globals().update({name: module_dict[name] for name in to_import})
Run Code Online (Sandbox Code Playgroud)

然而,这几乎肯定是一个非常糟糕的主意.你将毫不客气地踩踏任何具有相同名称的现有变量.当你from blah import *正常工作时,这已经够糟糕了,但是当你动态地做到这一点时,关于名字可能会发生碰撞的更多不确定性.您最好只my_module使用常规属性访问(例如my_module.someAttr)导入然后从中访问所需内容,或者getattr如果您需要动态访问其属性.