You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python同目录模块导入异常:运行上级脚本报ModuleNotFoundError

模块导入问题:运行baz.py时找不到foobar模块的原因与解决办法

问题场景

目录结构:

project
|    baz.py
|
|____pack1
|    |
|    |   foobar.py
|    |   test1.py
|    |
|

test1.py代码:

import foobar

baz.py代码:

from pack1 import test1

直接运行test1.py时能正常导入foobar模块,但运行baz.py时抛出异常:

ModuleNotFoundError: No module named 'foobar'

问题原因

  • 直接运行test1.py时,Python会把当前脚本所在的pack1/目录加入模块搜索路径sys.path,所以能找到同目录的foobar.py。
  • 运行baz.py时,Python的工作目录是project/,这个目录被加入sys.path。此时test1.py作为pack1包的模块被导入,它里面的import foobar会从sys.path(也就是project/目录)里查找,自然找不到存在于pack1/里的foobar。

解决办法

方法1:使用相对导入(推荐,符合Python包规范)

修改test1.py的导入语句,用相对路径指定从当前包导入foobar:

from . import foobar

注意:这种方式下test1.py不能直接作为脚本运行(直接运行会报错ValueError: attempted relative import in non-package),如果要运行test1.py,可以用包的方式启动:

python -m pack1.test1

方法2:将pack1目录手动加入搜索路径

在test1.py开头添加代码,把自身所在目录加入sys.path:

import sys
import os
# 将当前脚本所在目录加入模块搜索路径
sys.path.append(os.path.dirname(os.path.abspath(__file__)))
import foobar

这种方式既不影响直接运行test1.py,也能保证从baz.py导入时找到foobar。

方法3:修改baz.py的搜索路径

在baz.py开头把pack1目录加入sys.path:

import sys
import os
# 将pack1目录加入模块搜索路径
sys.path.append(os.path.join(os.path.dirname(os.path.abspath(__file__)), 'pack1'))
from pack1 import test1

不过这种方式硬编码了目录结构,灵活性稍差。

内容的提问来源于stack exchange,提问作者Kamal 37

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.23 06:36:34