Python模块导入疑问:直接/相对导入失败,sys.path方法为何可行?
Python模块导入问题解析
项目结构
API ├── Models │ └── PSU | └── PSUInjector.py └── Controller └── PSUController.py
背景信息
需求:在PSUController.py中导入PSUInjector.py里的PSUInjector类,已在/API、/Models、/PSU目录添加__init__.py文件。
运行环境:VS Code虚拟环境,直接在/Controller目录下运行PSUController.py脚本。
尝试的导入方式及报错
- 绝对导入语句:
from Models.PSU.PSUInjector import PSUInjector
报错:ModuleNotFoundError: No module named 'Models' - 相对导入语句:
from ..Models.PSU.PSUInjector import PSUInjector
报错:ImportError: attempted relative import with no known parent package
成功的导入方式
以下代码可实现正常导入:
import sys sys.path.append("..") from Models.PSU.PSUInjector import PSUInjector
原因解析
- 绝对导入失败的原因:Python的模块搜索路径(
sys.path)默认包含当前运行脚本所在的目录(即/Controller),而Models目录位于上级的/API目录下,不在默认的搜索路径中,因此Python无法找到Models模块。 - 相对导入失败的原因:相对导入依赖于当前脚本作为某个包的一部分被导入或执行。但直接在
/Controller目录下运行PSUController.py时,脚本会被当作顶层脚本执行,Python不会将其视为API包的子模块,自然无法识别..所指向的父包路径。 - sys.path方法可行的原因:
sys.path.append("..")将/API目录(/Controller的上级目录)添加到了模块搜索路径中,此时Models目录处于Python可搜索到的路径下,绝对导入语句就能正常找到目标类。
内容的提问来源于stack exchange,提问作者tbuschendorf
相关产品推荐
相关产品推荐

