Python:使用 importlib 从字符串动态导入模块的代码

标签 python python-3.x python-importlib dynamic-import

我希望在 Python (3.7) 中动态导入一个模块,模块的代码是在一个字符串中定义的。

下面是一个使用 imp 模块的工作示例,该模块已被弃用,取而代之的是 importlib(从版本 3.4 开始):

import imp

def import_code(code, name):
    # create blank module
    module = imp.new_module(name)
    # populate the module with code
    exec(code, module.__dict__)
    return module

code = """
def testFunc():
    print('spam!')
"""

m = import_code(code, 'test')
m.testFunc()

Python 的文档声明应该使用 importlib.util.module_from_spec() 而不是 imp.new_module()。但是,似乎没有办法使用 importlib 模块创建空白模块对象,就像我可以使用 imp 一样。

如何使用 importlib 而不是 imp 来获得相同的结果?

最佳答案

您可以简单地实例化types.Module:

import types
mod = types.ModuleType("mod")

然后你可以用 exec 填充它,就像你做的那样:

exec(code, mod.__dict__)
mod.testFunc() # will print 'spam!'

因此您的代码将如下所示:

import types

def import_code(code, name):
    # create blank module
    module = types.ModuleType(name)
    # populate the module with code
    exec(code, module.__dict__)
    return module

code = """
def testFunc():
    print('spam!')
"""

m = import_code(code, 'test')
m.testFunc()

正如@Error - Syntactical Remorse 所评论的,您应该记住 exec 基本上执行您提供的字符串中包含的任何代码,因此您应该格外小心地使用它。 至少检查一下你得到的是什么,但最好只使用预定义的字符串。

关于Python:使用 importlib 从字符串动态导入模块的代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55905240/

相关文章:

python - 类型错误 : expected string or bytes-like object for Regex in Python

python - 播放音频文件后 pygame 没有响应

python - 为什么使用 classmethod 而不是 staticmethod?

python的json : AttributeError: 'str' object has no attribute 'keys'

python - 从两个字典中添加值

python - Maya——通过 Python 在视口(viewport)中选择对象

python - 我可以使用内置名称作为 Python 类的方法名称吗?

python - 如何在 python 中使用 __code__ 获取包装函数的 firSTLineno?

python-3.x - 从字符串导入lib.reload模块?

python - 使用 "current-directory"imports 导入模块