Python直接运行脚本正常 以-m模块运行报ModuleNotFoundError原因求解
问题原因解析
你之前的初步结论存在偏差,问题恰恰是两种运行模式下Python的模块搜索逻辑差异导致的:
由于两种运行方式下
sys.path的输出都包含/Users/me/Desktop/MyProject,因此问题应该和导入作用域无关?
你只贴出了-m运行模式的sys.path,实际两种运行模式的sys.path首位条目完全不同:
- 运行
python src/bot/main.py时:Python会自动将main.py所在的目录/Users/me/Desktop/test_py/src/bot加入sys.path的首位,你直接写import sib1时,Python能直接在该目录下找到sib1.py文件,因此导入成功。 - 运行
python -m src.bot.main时:Python会将你执行命令的当前工作目录/Users/me/Desktop/test_py加入sys.path首位,此时Python只会在sys.path列出的所有路径下搜索名为sib1的模块,而这些路径中不包含src/bot目录,自然找不到sib1.py,触发ModuleNotFoundError。
修复方案
以下三种方案按优先度排序:
- 使用符合包结构的绝对导入(最规范,适配所有运行场景)
将导入语句修改为:
from src.bot import sib1
只要你执行命令的工作目录在test_py层级下,两种运行方式都能正常找到模块。
- 显式添加目标目录到sys.path(适配原有写法,不推荐长期使用)
在导入sib1前加入代码手动补全搜索路径:
import os sys.path.append(os.path.dirname(os.path.abspath(__file__)))
操作完成后就可以保持原有import sib1的写法正常运行。
- 使用包内相对导入(仅适配
-m运行模式)
将导入语句修改为:
from . import sib1
这种写法仅在你使用-m将文件作为包模块运行时生效,直接运行python src/bot/main.py会因为脚本被识别为顶层模块、不支持相对导入而报错。
内容的提问来源于stack exchange,提问作者NeoZoom.lua
相关产品推荐
相关产品推荐

