首页 >后端开发 >Python教程 >从字符串变量导入模块时,Python 的 `__import__` 与标准 `import` 有何不同?

从字符串变量导入模块时,Python 的 `__import__` 与标准 `import` 有何不同?

Patricia Arquette
Patricia Arquette原创
2024-12-05 05:39:09979浏览

How Does Python's `__import__` Differ from Standard `import` When Importing Modules from String Variables?

使用“__import__”从字符串变量导入模块:与普通导入语句的区别

在 Python 中,import函数允许从字符串变量动态导入模块。但是,与使用常规导入语句相比,这可能会导致意外结果。

考虑以下示例:

import matplotlib.text as text
x = dir(text)  # Get attributes of matplotlib.text

i = __import__('matplotlib.text')
y = dir(i)  # Get attributes of the imported module

j = __import__('matplotlib')
z = dir(j)  # Get attributes of matplotlib

结果列表的比较表明 y 对象包含以下内容的混合:来自 matplotlib 和 matplotlib.text 的属性,而它缺少有关 matplotlib.text 中主类的所需信息。

此行为由导入函数的机制。默认情况下,它导入由字符串参数指定的顶级模块。在本例中,“matplotlib.text”引用 matplotlib.text 模块,但 import 改为导入 matplotlib。

要解决此问题,您可以提供一个空字符串作为第三个参数到 __import__,如以下修改后的代码所示:

i = __import__('matplotlib.text', fromlist=[''])
y = dir(i)  # Get attributes of matplotlib.text

这将导致 import 到专门导入 matplotlib.text 模块,导致 y 包含所需的属性列表。

另一种方法是使用 Python 3.1 的 importlib 模块:

import importlib

i = importlib.import_module("matplotlib.text")
y = dir(i)  # Get attributes of matplotlib.text

此方法提供了从字符串导入模块的更一致和直接的方法

注意:

  • 从子文件夹(例如 ./feature/email.py)导入时,importlib 语法变为 importlib.import_module(" feature.email")。
  • 在 Python 3.3 之前,存在使用 importlib.import_module 导入需要文件夹中的 __init__.py 文件。

以上是从字符串变量导入模块时,Python 的 `__import__` 与标准 `import` 有何不同?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn