如何使用Python的__import__函数实现'from foo import *

1 投票
1 回答
1020 浏览
提问于 2025-04-15 15:19

我想把我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 里完成啊?

撰写回答