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

标签 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"

但这会引发此异常:

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/

相关文章:

python - 字典键错误python

python - 根据条件在 Pandas Dataframe 中插入行

python - 如何防止动态库多次初始化

python - 动态导入 : How to import * from module name from variable?

Python:exec 总是不好的做法吗?如果是,为什么不弃用

python - exec 函数在 python 3.6 中无法正常工作

python - 在 python 中,如何创建一个在运行时之前未指定名称的新变量(编辑 : How do you use setattr() with a list compehension)?

Python 日志记录 : change log message level

python - 如何在python中导入仅包含某些字符串的 "dat"文件

python - 如果嵌套在函数中,listcomp 无法访问 exec 调用的代码中定义的局部变量