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

为何`python3 -m project`报ModuleNotFoundError而`python3 __main__.py`可正常运行?

嘿,我来帮你拆解这个问题——我之前也踩过类似的坑!

问题到底出在哪?

核心原因是用python3 -m memorizeIT和直接跑__main__.py时,Python的模块搜索路径(sys.path)完全不一样,再加上你写的__init__.py逻辑根本不对,才导致导入失败。

具体说俩场景的区别:

  • 当你在memorizeIT目录里执行python3 __main__.py,Python会自动把当前目录(也就是memorizeIT)加到sys.path里,所以import gui能直接找到同目录的gui.py,自然没问题。
  • 但你用-m参数运行时,Python会把你执行命令时所在的父目录加到sys.path里(比如你在memorizeIT的上级文件夹跑命令,sys.path里就只有这个上级目录)。这时候import gui会去上级目录找gui.py,找不到就报ModuleNotFoundError了。

另外你写的__init__.py完全是无效操作:subprocess.call('pwd')返回的是命令的退出状态码(成功就是0),不是当前路径!所以你等于把0加到了sys.path里,这根本帮不上忙,反而可能添乱。

怎么解决?

给你三个简单的方案,选一个顺手的就行:

方案1:改用相对导入(最推荐)

把__main__.py里的import gui改成相对导入的写法:

from . import gui

这种写法明确告诉Python:“去当前模块(也就是memorizeIT目录)里找gui模块”,不管是用-m还是直接跑__main__.py都能正常工作,最规范。

方案2:手动把项目目录加到sys.path

如果不想改导入语句,就在__main__.py的最开头加几行代码,把当前脚本所在的目录(也就是memorizeIT)加到sys.path里:

import sys
from pathlib import Path

# 获取__main__.py所在的文件夹路径
current_dir = Path(__file__).parent
sys.path.append(str(current_dir))

# 现在再导入gui就没问题了
import gui

这种方式不用改现有导入代码,适合不想动原有逻辑的场景。

方案3:修正__init__.py(不推荐,但能用)

其实用-m运行模块时,__init__.py会被先加载,你可以把正确的路径加到sys.path里:

import sys
from pathlib import Path

# 获取当前模块(memorizeIT)的目录
module_dir = Path(__file__).parent
sys.path.append(str(module_dir))

不过这种方式会影响整个模块的导入环境,不如前两种简洁,所以优先选前两个。

验证一下

改完之后,回到memorizeIT的上级目录,执行python3 -m memorizeIT,应该就能正常运行啦!


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 16:12:53