如何使用Python的__import__函数实现'from foo import *
我想把我Django系统中的settings.py
文件换成一个名为settings
的目录,这个目录里有一个__init__.py
文件。这样做的目的是为了能够根据不同的服务器导入不同的设置。
如果我在导入模块之前不知道模块的名字,那我就不能用import
这个关键字,而是需要用__import__
这个函数。不过,这样做并不能把模块里的内容添加到settings
模块中。我需要的效果就像是from MACHINE_NAME import *
那样。或者,我需要一种方法来遍历vars(m)
(这里的m
是已经加载的模块),然后把它们添加到当前的命名空间中。但是我不知道怎么指代当前的命名空间,以便进行赋值。换句话说,我不能用setattr(x, ..)
或者修改x.__dict__
,因为我不知道x
应该用什么。
现在我想不出其他的办法,除了使用exec
。这让我觉得有点无力。我是不是漏掉了Python中某些可以让我在当前作用域内进行操作的特性呢?
1 个回答
1
在类似的情况下,根据语言设置,我会在 messages.py 模块中导入不同的消息,类似于下面这样:
# set values in current namespace
for name in vars(messages):
v = getattr(messages, name)
globals()[name] = v
顺便问一下,你为什么想为 settings.py 创建一个包呢?你想做的事情其实可以直接在 settings.py 里完成啊?