使用__import__函数从...导入*
可能重复的问题:
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
。根据文档,这和从名字导入类名的效果是一样的。