从Python中动态创建的模块导入代码

从Python中动态创建的模块导入代码,python,python-import,python-exec,Python,Python Import,Python Exec,我有一个项目,它尝试动态创建一个新模块,然后在随后的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

我有一个项目,它尝试动态创建一个新模块,然后在随后的
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
回溯(最近一次呼叫最后一次):
文件“test.py”,第14行,在
exec“导入testmodule.testA”
文件“”,第1行,在
ImportError:没有名为testmodule.testA的模块
我尝试了几种方法:将其添加到sys.modules中,创建一个
范围
dict,其中还包含名称和模块。但是没有骰子。当我在
exec
语句中执行
print locals()
时,可以看到testmodule.testA,但无法导入它。我错过了什么


谢谢。

您需要将模块添加到
sys.modules
结构中,以便
import
找到它:

import sys
sys.modules['testmodule.testA'] = mod
但是,您已经拥有模块对象,再次导入它没有多大意义
mod
是对Python已经“导入”的引用

如果没有
导入
调用,以下操作将起作用:

mod.MyClass
如果在
exec
调用中需要该模块,请将其添加到该命名空间中:

exec 'instance = MyClass()' in {'MyClass': mod.MyClass}

第二个
exec
语句就是一个例子。实际上,它是一些代码的字符串序列化形式,需要来自第一个
exec
的代码/模块。因此,基本上,我正在生成一组模块对象,然后运行一个方法,该方法使用生成的模块并充当某个进程的入口点。您说您已经“尝试将其添加到sys.modules”,这是后续导入工作所必需的。但这并没有显示在您的代码中。你真的按照下面Martjin Pieters的回答做了吗?