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如果您需要动态访问其属性.