3

我有一个项目试图动态创建一个新模块,然后在后续exec语句中尝试导入该模块。

import imp

s="""
class MyClass(object):
    def __init__(self):
        pass
    def foo(self):
        pass
"""

mod = imp.new_module("testmodule.testA")
exec s in mod.__dict__

exec "import testmodule.testA"

但这会引发此异常:

Traceback (most recent call last):
File "test.py", line 14, in <module>
exec "import testmodule.testA"
File "<string>", line 1, in <module>
ImportError: No module named testmodule.testA

我已经尝试了几件事:将它添加到 sys.modules,创建一个scope包含名称和模块的字典。但没有骰子。当我print locals()在我的exec语句中执行 a 时,我可以看到 testmodule.testA,但我无法导入它。我在这里想念什么?

谢谢你。

4

1 回答 1

1

您需要将模块添加到sys.modules结构中import才能找到它:

import sys
sys.modules['testmodule.testA'] = mod

但是,您已经有了模块对象,再次导入它没有多大意义。mod是对 Python已经“导入”的内容的引用。

以下将在没有调用的情况下工作import

mod.MyClass

如果您在exec调用中需要该模块,请将其添加到那里的命名空间:

exec 'instance = MyClass()' in {'MyClass': mod.MyClass}
于 2014-10-04T13:03:56.027 回答