Python跨目录导入模块遭遇ModuleNotFoundError问题咨询
解决Python跨目录模块导入的ModuleNotFoundError问题
错误原因
你在s1.py中使用的from .p2 import s2是错误的:.代表当前包(p1),而p2是p1的同级包,并非p1的子包,所以Python找不到对应的模块。
修复方案
方案1:使用绝对导入
基于项目根包py_path编写导入语句,确保Python能从根目录定位模块:
修改py_path/p1/s1.py内容:
from py_path.p2 import s2 s2.f2()
注意事项:运行时需要保证py_path所在的父目录在Python的sys.path中。比如你的目录结构是父目录/py_path/...,则需在父目录下执行命令:
python -m py_path.p1.s1
也可以将父目录添加到系统环境变量PYTHONPATH中,这样任意位置都能识别py_path包。
方案2:使用正确的相对导入
利用..表示当前包的父包(即py_path),从而导入同级的p2包:
修改py_path/p1/s1.py内容:
from ..p2 import s2 s2.f2()
注意事项:这种方式不能直接运行s1.py文件,必须将其作为包的一部分启动。需在py_path的父目录下执行:
python -m py_path.p1.s1
直接运行python s1.py会触发错误,因为此时Python不会将该文件视为包的组成部分。
优化包结构(可选)
当前的__init__.py设置基本合理,可根据需求简化:
py_path/__init__.py:保留from . import p1, p2或留空均可p1/__init__.py:若需导出s1的内容,建议改为from .s1 import *(添加.避免全局查找)p2/__init__.py:同理改为from .s2 import *
内容的提问来源于stack exchange,提问作者TheZinter
相关产品推荐
相关产品推荐

