You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过字符串动态导入Python嵌套包?

动态导入子模块的问题分析与解决

操作中的问题

  1. importlib.import_module参数误用:你调用importlib.import_module("pytester", package="_pytest")时,传入的pytester是绝对导入格式,但实际需要的是相对_pytest的子模块。这种情况下必须用相对导入写法(模块名前加.),否则Python会从全局命名空间查找pytester,自然触发找不到模块的错误。
  2. importlib.__import__的默认特性:__import__函数默认返回最顶层的模块(比如_pytest),而非你指定的深层子模块,除非主动设置fromlist参数改变这一行为。

正确实现方式

方式1:修正importlib.import_module调用

可以用相对导入格式指定子模块,或者直接使用完整的绝对路径:

# 相对导入写法
import importlib
mod = importlib.import_module(".pytester", package="_pytest")

# 绝对导入写法(更直观)
import importlib
mod = importlib.import_module("_pytest.pytester")

方式2:调整importlib.__import__的参数

通过fromlist参数让__import__返回目标子模块:

import importlib
mod = importlib.__import__("_pytest.pytester", fromlist=[""])

只要fromlist是非空列表,__import__就会返回你指定的最深层模块,而非顶层模块。

方式3:利用sys.modules缓存

子模块一旦被导入(不管静态还是动态方式),都会被缓存到sys.modules字典中,直接通过模块全名获取即可:

import sys
# 先确保模块已导入,可通过动态或静态导入方式
import _pytest.pytester
mod = sys.modules["_pytest.pytester"]

内容的提问来源于stack exchange,提问作者cowlinator

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 10:50:16