Python3导入上级目录文件报错:ImportError: 相对导入无已知父包
Python相对导入报错:ImportError: attempted relative import with no known parent package
问题详情
运行TES.py时触发如下错误:
Traceback (most recent call last): File "/Users/apzuba/Documents/Programowanie/FOLDER/Z/TES.py", line 5, in <module> from .. import ESE ImportError: attempted relative import with no known parent package
当前目录结构:
/FOLDER ├── ESE.py └── Z └── TES.py
TES.py代码:
from .. import ESE print("gut")
尝试其他导入方式均失败:
from FOLDER import ESE:报错ModuleNotFoundError: No module named 'FOLDER'import FOLDER.ESE:报错ModuleNotFoundError: No module named 'FOLDER'from ..FOLDER import ESE/from .FOLDER import ESE:报错ImportError: attempted relative import with no known parent package
可行解决方案
1. 以模块形式运行脚本
回到FOLDER的上级目录(即/Users/apzuba/Documents/Programowanie/),执行以下命令:
python -m FOLDER.Z.TES
这种方式会将FOLDER识别为Python包,相对导入逻辑就能正常生效。
2. 手动添加模块搜索路径
修改TES.py,在开头加入代码将FOLDER目录加入sys.path:
import sys from pathlib import Path # 获取FOLDER目录的绝对路径 folder_dir = Path(__file__).parent.parent sys.path.append(str(folder_dir)) import ESE print("gut")
这样Python就能找到ESE.py模块,直接导入即可。
3. 将FOLDER转为正式Python包
在FOLDER目录下创建空的__init__.py文件,目录结构变为:
/FOLDER ├── __init__.py ├── ESE.py └── Z └── TES.py
之后同样从FOLDER上级目录,用模块方式运行:
python -m FOLDER.Z.TES
问题根源
Python相对导入仅适用于被作为模块导入的文件。如果直接运行TES.py(如python TES.py),Python会将其视为顶层脚本,无法识别它的父包结构,因此触发相对导入错误。而绝对导入找不到FOLDER,是因为该目录不在Python默认的模块搜索路径sys.path中。
内容的提问来源于stack exchange,提问作者Adam Zu
相关产品推荐
相关产品推荐

