Python从父目录导入模块失败,求有效解决方法
问题原因
你遇到的ImportError: attempted relative import with no known parent package,核心原因是直接运行test.py时,Python会把它当作独立的顶层脚本,而非root_package包的一部分,此时相对导入依赖的模块__package__属性不存在,导致相对导入失效。
解决方案(不一定非要改sys.path)
方法1:正确相对导入+以包模块方式运行
- 修正
test.py里的导入语句:
(from .. import commontest是root_package的子包,..代表上层的root_package目录,导入时不需要加.py后缀) - 切换到
root_package的上级目录(即包含root_package的文件夹),执行命令:
用python -m root_package.test.test-m参数让Python把root_package当作包加载,此时相对导入就能正常工作。
方法2:绝对导入(无需修改代码里的sys.path)
把root_package的上级目录添加到Python搜索路径:
- 临时方式:运行
test.py前设置环境变量(Windows用set,Linux/macOS用export):# Linux/macOS export PYTHONPATH=/path/to/root_package_parent_dir:$PYTHONPATH # Windows set PYTHONPATH=C:\path\to\root_package_parent_dir;%PYTHONPATH% - 永久方式:将该路径添加到Python的
site-packages目录下的.pth文件中。
之后test.py里直接用绝对导入:
from root_package import common
无论直接运行test.py还是用-m方式,都能正常导入。
方法3:修改sys.path(备选,不推荐)
如果一定要直接运行test.py,可以在脚本开头手动把项目根目录加入搜索路径:
import sys from pathlib import Path # 获取root_package目录的路径(当前test.py的父目录的父目录) sys.path.append(str(Path(__file__).parent.parent)) from root_package import common
这种方法虽能解决问题,但会让代码和项目结构耦合,迁移或调整结构时容易出错,不推荐作为长期方案。
内容的提问来源于stack exchange,提问作者Student4K
相关产品推荐
相关产品推荐

