从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的回答做了吗?