使用__import__函数从...导入*

5 投票
2 回答
6231 浏览
提问于 2025-04-16 01:42

可能重复的问题:
from . import x 使用 __import__?
如何用 Python 的 __import__ 函数实现 import * from module 的效果?

我该如何用 __import__ 函数来实现 from ... import * 的功能呢?因为我只在运行时知道文件的名字,而且那个文件里只有一个类。

2 个回答

6

如果有谁想知道标题中问题的实际答案,可以通过操作 vars() 字典来实现。没错,在大多数情况下这样做确实有点傻,但我能想到一些场景,这样做会非常有用或者很酷(比如,你可能想要一个静态的模块名称,但模块的内容却希望在运行时从其他地方获取。这样做类似于 django.conf.settings 的行为,我觉得还更好一些,如果你对它有了解的话)。

module_name = "foo"
for key, val in vars(__import__(module_name)).iteritems():
    if key.startswith('__') and key.endswith('__'):
        continue
    vars()[key] = val

这段代码会把模块 foo.py 中所有非系统的变量都导入到当前的命名空间里。

请谨慎使用哦 :)

3

别这样。真的别这样。我需要解释这有多糟糕吗?动态导入(虽然有时候是不可避免的)和把东西导入全局命名空间(总是可以避免,但有时候是更简单的解决方案,且在可信模块中可以接受)本身就已经够糟糕了。把东西动态导入全局命名空间简直就是……一场噩梦(而且是可以避免的)。

你只需要这样做:_temp = __import__(name, globals(), locals(), [name_of_class]); your_class = _temp.name_of_class。根据文档,这和从名字导入类名的效果是一样的。

撰写回答