项目设计疑问:在main.py中导入子模块时触发ModuleNotFoundError的原因排查
为什么运行main.py时出现
ModuleNotFoundError,直接运行Child.py却正常? 这个问题的核心是Python模块搜索路径(sys.path)在不同运行场景下的差异,以及导入方式的适配问题:
原因分析
- 当你在
package1目录下直接运行Child.py时,Python会把当前工作目录(也就是package1)添加到sys.path里。这时候from Parent import *会在sys.path里找Parent.py,自然能找到同目录下的文件,所以运行正常。 - 但当你在
folder目录下运行main.py时,Python会把folder目录添加到sys.path里。这时候执行from package1 import Child,Python会加载package1/Child.py,而Child.py里的from Parent import *会在sys.path的根目录(也就是folder)里找Parent模块——但Parent.py在package1子目录里,所以找不到,就抛出了ModuleNotFoundError。
解决方案
你有两种靠谱的修改方式:
1. 使用相对导入(推荐)
把Child.py里的导入语句改成:
from .Parent import *
这里的.代表当前包(package1),Python会从当前模块所在的包内部去查找Parent模块,不管你从哪个目录导入package1.Child,都能正确找到依赖。
2. 使用绝对导入
如果你更习惯绝对路径的写法,也可以改成:
from package1.Parent import *
这样Python会从sys.path的根目录(也就是folder)开始,逐层查找package1下的Parent模块,同样能解决问题。
额外注意
如果你之后还需要直接运行Child.py,建议用模块运行模式:
# 在folder目录下执行 python -m package1.Child
这种方式会让Python把package1当作一个包来处理,相对导入也能正常工作,避免直接运行脚本时可能出现的路径问题。
内容的提问来源于stack exchange,提问作者Rhlahat
相关产品推荐
相关产品推荐

