在 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)
我想从一个函数中导入一个模块。例如:
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)