正如评论已经指出的那样,在今天的 Python 中,实例化没有内置名称的类型的首选方法是调用通过标准库中的types模块获得的类型:
>>> import types
>>> m = types.ModuleType('m', 'The m module')
请注意,这不会自动将新模块插入sys.modules
:
>>> import sys
>>> sys.modules['m']
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
KeyError: 'm'
这是您必须手动执行的任务:
>>> sys.modules['m'] = m
>>> sys.modules['m']
<module 'm' (built-in)>
这可能很重要,因为模块的代码对象通常在模块添加到之后sys.modules
执行——例如,这样的代码引用 是完全正确的,如果你忘记了这一步 sys.modules[__name__]
,那将失败 ( )。在此步骤之后,并按照您在编辑中已有的设置,KeyError
m.__file__
>>> code = compile("a=23", "m.py", "exec")
>>> exec code in m.__dict__
>>> m.a
23
(或 Python 3 的等价函数 where exec
is a function,如果 Python 3 是您使用的,当然;-) 是正确的(当然,您通常会通过比编译字符串更微妙的方式获得代码对象,但是这对您的问题不重要;-)。
在旧版本的 Python 中,您会在开始时使用new
模块而不是types
模块来创建新的模块对象,但new
自 Python 2.6 起已弃用并在 Python 3 中删除。