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

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。
修复方案

以下三种方案按优先度排序:

  1. 使用符合包结构的绝对导入(最规范,适配所有运行场景)
    将导入语句修改为:
from src.bot import sib1

只要你执行命令的工作目录在test_py层级下,两种运行方式都能正常找到模块。

  1. 显式添加目标目录到sys.path(适配原有写法,不推荐长期使用)
    在导入sib1前加入代码手动补全搜索路径:
import os
sys.path.append(os.path.dirname(os.path.abspath(__file__)))

操作完成后就可以保持原有import sib1的写法正常运行。

  1. 使用包内相对导入(仅适配-m运行模式)
    将导入语句修改为:
from . import sib1

这种写法仅在你使用-m将文件作为包模块运行时生效,直接运行python src/bot/main.py会因为脚本被识别为顶层模块、不支持相对导入而报错。

内容的提问来源于stack exchange,提问作者NeoZoom.lua

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 21:48:01