鉴于我有一个模块的代码对象,我如何获得相应的模块对象?
它看起来像是moduleNames = {}; exec code in moduleNames非常接近我想要的东西.它将模块中声明的全局变量返回到字典中.但是,如果我想要实际的模块对象,我该如何获得它?
编辑:看起来你可以滚动自己的模块对象.模块类型不方便记录,但您可以执行以下操作:
import sys
module = sys.__class__
del sys
foo = module('foo', 'Doc string')
foo.__file__ = 'foo.pyc'
exec code in foo.__dict__
Ale*_*lli 21
正如评论已经表明的那样,在今天的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等价于哪里exec是函数,如果你正在使用Python 3,当然;-)是正确的(当然,你通常通过微妙的方式获得代码对象而不是编译字符串,但是这对你的问题不重要;-).
在旧版本的Python中,您可以使用new模块而不是types模块在开始时创建一个新的模块对象,但是new从Python 2.6 开始不推荐使用它,并在Python 3中删除.