如何通过字符串动态导入Python嵌套包?
动态导入子模块的问题分析与解决
操作中的问题
importlib.import_module参数误用:你调用importlib.import_module("pytester", package="_pytest")时,传入的pytester是绝对导入格式,但实际需要的是相对_pytest的子模块。这种情况下必须用相对导入写法(模块名前加.),否则Python会从全局命名空间查找pytester,自然触发找不到模块的错误。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
相关产品推荐
相关产品推荐

