Python 3.9中find_spec无法识别相对导入的原因及正确调用方式
解决find_spec无法识别.pyd模块的问题
问题原因
你调用find_spec('wolfpy','.libs')返回None的核心原因有两个:
find_spec的第二个参数是父模块的名称,不是目录路径,传入.libs不符合参数要求;./libs目录没有被Python识别为合法包(缺少__init__.py文件),导致find_spec无法正确解析模块位置。
解决方案
步骤1:将libs目录转为合法包
在./libs目录下创建一个空的__init__.py文件,让Python将其识别为可导入的包。
步骤2:正确调用find_spec
有两种可行的调用方式:
方式1:基于当前模块的相对导入解析
from importlib.util import find_spec # 用相对模块名'.libs.wolfpy',结合当前模块的__name__作为上下文包 spec = find_spec('.libs.wolfpy', package=__name__) print(f".libs imports {spec}") from .libs import wolfpy
方式2:基于绝对导入的解析
import sys from pathlib import Path from importlib.util import find_spec # 将脚本所在目录添加到Python的模块搜索路径 sys.path.append(str(Path(__file__).parent)) # 直接用绝对模块名查找 spec = find_spec('libs.wolfpy') print(f".libs imports {spec}") from libs import wolfpy
原理说明
find_spec的package参数用于提供相对模块名的解析上下文,传入__name__(当前模块的名称)才能正确识别.libs.wolfpy这种相对模块路径;- 添加
__init__.py是让Python将libs视为包的必要条件,否则即使直接导入能临时生效,find_spec也无法通过包的规则找到模块。
内容的提问来源于stack exchange,提问作者wiz21
相关产品推荐
相关产品推荐

