【问题标题】:How do I do 'from foo import *' using Python's __import__ function如何使用 Python 的 __import__ 函数执行“from foo import *”
【发布时间】:2009-10-23 17:29:50
【问题描述】:

我想将我的 Django 系统中的 settings.py 替换为一个模块,该模块实现为包含 __init__.py 的目录 settings。这将尝试导入以服务器命名的模块,从而允许每个服务器设置。

如果我在导入模块之前不知道模块的名称,那么我不能使用import 关键字,而必须使用__import__ 函数。但这不会将模块的内容添加到settings 模块中。我需要相当于from MACHINE_NAME import *。或者我需要一种方法来迭代vars(m)(其中m 是加载的模块)并将它们添加到当前命名空间。但我不知道如何引用当前命名空间来进行分配。也就是说,我不能使用setattr(x, ..),也不能修改x.__dict__,因为我不知道x用什么。

除了使用 exec 之外,我现在想不出其他可以尝试的方法。这对我来说似乎有点弱。我是否遗漏了 Pythonic 内省的某些方面,这些方面可以让我在当前范围内操纵当前范围?

【问题讨论】:

  • 谢谢——老实说,我确实尝试过搜索它,但是当去掉下划线时,import 不是一个非常具体的搜索词...... :-)

标签: python import


【解决方案1】:

对于基于语言设置的类似情况,我在 messages.py 模块中导入不同的消息类似于

# set values in current namespace
for name in vars(messages):
    v = getattr(messages, name)
    globals()[name] = v

顺便说一句,你为什么要为 settings.py 创建一个包?想做什么都可以直接在settings.py中完成?

【讨论】:

  • 主要是将每台机器的配置文件保存在它们自己的目录中,这样就不会弄乱应用程序的其余部分。由于无论哪种方式都会涉及到一个目录,因此将 init.py 放在那里似乎是合理的......
  • 但重点是 globals() 是当前的命名空间——它甚至在文档中这么说 docs.python.org/library/functions.html#globals>——但我总是模糊地认为它是“顶级”命名空间,这是错误的。
猜你喜欢
  • 1970-01-01
  • 2017-09-06
  • 2012-02-25
  • 1970-01-01
  • 1970-01-01
  • 2015-11-21
  • 1970-01-01
  • 1970-01-01
  • 2016-02-02
相关资源
最近更新 更多