我有一个项目尝试动态创建新模块,然后在后续的 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
字典。但没有骰子。当我在 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}
关于python - 从 Python 中动态创建的模块导入代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26193102/