Python运行上级目录脚本时同目录模块导入失败如何解决
问题原因
该错误是Python模块搜索路径逻辑导致的,你添加空__init__.py仅能将pkg标记为Python可识别的包,无法解决路径搜索问题:
- 运行
test.py时,Python会默认将test.py所在的test/目录加入模块搜索路径sys.path,不会自动将test/pkg/目录加入搜索列表 p1.py中写import p2时,Python只会在sys.path包含的所有目录下查找名为p2的模块,自然找不到存放在pkg目录下的p2.py,就会抛出ModuleNotFoundError
可用解决方法
推荐按优先级选择以下方案:
- 方案1:包内使用相对导入
将p1.py中的import p2修改为from . import p2即可。该写法明确告诉Python从当前模块所属的包的同级目录查找p2,不需要依赖全局搜索路径,是包内模块互相导入的标准实现。 - 方案2:使用基于根包的绝对导入
将p1.py中的import p2修改为import pkg.p2,同时将调用语句修改为pkg.p2.print_p2()。因为运行test.py时test/目录在搜索路径中,pkg是可识别的根包,按完整包路径导入即可正常定位到p2模块。 - 方案3:手动添加路径(仅兜底使用,不推荐)
如果不方便修改包内导入逻辑,可以在test.py的最开头添加以下代码,手动将pkg目录加入搜索路径:
import sys import os sys.path.append(os.path.join(os.path.dirname(__file__), 'pkg'))
该方案硬编码了路径逻辑,项目迁移或目录结构调整时容易失效,仅做临时兜底使用。
内容的提问来源于stack exchange,提问作者William Fung
相关产品推荐
相关产品推荐

