在 Python 3.X 中动态导入模块

Importing modules dynamically in Python 3.X

我想从一个函数中导​​入一个模块。例如:

from directory.folder.module import module

def import():   
    app.register_blueprint(module)

为此:

def import():   
    from directory.folder.module import module

但是,无需对其进行硬编码。例如:

def import():
    m = "module"
    from directory.folder.m import m

可能吗?提前致谢

不,python import 这样不行。

例如您尝试导入名为 mod 的模块,因此您 运行 import mod。现在解释器将在从以下来源收集的目录列表中搜索 mod.py

  • 输入脚本所在的目录 运行 或当前目录,如果解释器正在 运行 交互。

  • PYTHONPATH 环境变量中包含的目录列表(如果已设置)。 (PYTHONPATH 的格式依赖于 OS,但应模仿 PATH 环境变量。)

  • 安装时配置的依赖于安装的目录列表 Python。

因此,如果您有一个名为 m='mod' 和 运行 import m 的变量,它将搜索 m.py 而不是 mod.py.

但是 愚蠢的危险 解决方法是使用 exec()恶意输入警告

m = "module"
exec(f'from directory.folder.m import {m}')

如果您不介意外部模块,请尝试 importlib

您需要 importlib 模块。

这是使用此模块的最简单方法。有很多不同的方法可以将模块调用的结果编织到环境中:

import importlib

math = importlib.import_module("math")

print(math.cos(math.pi))

结果:

-1.0

我经常使用这个库。我用它构建了一个完整的插件部署系统。所有各种部署的脚本都放在目录中,只有在配置文件中提到它们时才会导入,而不是必须立即导入所有内容。

我觉得这个模块很酷的一点是它的文档最上面的陈述:

The purpose of the importlib package is two-fold. One is to provide the implementation of the import statement (and thus, by extension, the import() function) in Python source code.

2.7 文档中的介绍也很有趣:

New in version 2.7.

This module is a minor subset of what is available in the more full-featured package of the same name from Python 3.1 that provides a complete implementation of import. What is here has been provided to help ease in transitioning from 2.7 to 3.1.

您可以使用 importlib 模块以编程方式导入模块。

import importlib

full_name = "package." + "module"

m = importlib.import_module(full_name)