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

MacOS zsh环境下Python模块导入遇ModuleNotFoundError问题求助

MacOS zsh环境下Python模块导入遇ModuleNotFoundError问题求助

嗨,我来帮你排查这个模块导入的问题~先理清楚你的场景:

你在MacOS的zsh环境下,Python项目结构是这样的:

app/
|__init__.py
|src/
| |__init__.py
| |base/
| | |__init__.py
| | |settings.py
| | |migrations/
| | | |__init__.py
| | | |commands.py

commands.py里写了from base import settings,已经设置了PYTHONPATH=/user/Desktop/app,当前工作目录也是/user/Desktop/app,但不管是直接运行脚本还是尝试用-m参数运行,都报错找不到base模块。

问题原因

核心问题出在Python的模块搜索逻辑和你的导入写法不匹配:

  • 当你直接运行python3 src/base/migrations/commands.py时,Python会把**脚本所在的目录(/user/Desktop/app/src/base/migrations)**加到sys.path最前面,而你的base模块在src/base下,此时Python在sys.path里找不到名为base的顶级模块;
  • 你用python3 -m src/base/migrations/commands.py的写法也是错的,-m参数后面需要跟模块路径(用点分隔),不是文件路径。

解决方案

这里给你几个可行的解决办法,按需选择:

方案1:修改为绝对导入(推荐)

把commands.py里的导入语句改成:

from src.base import settings

因为你已经把app目录加入了PYTHONPATH,Python会从app目录开始搜索,src.base是完整的模块路径,这样就能正确找到settings了。修改后不管是直接运行脚本还是用模块方式运行都能生效。

方案2:用相对导入+正确的模块运行方式

如果你想保留相对路径的导入逻辑,可以把commands.py的导入改成:

from .. import settings

(这里的..表示向上跳一级目录,也就是从migrations回到base目录,刚好能找到settings.py)

然后在app目录下用正确的模块运行命令:

python3 -m src.base.migrations.commands

注意这里用**点.**分隔模块路径,而不是斜杠/,这样Python会把app作为模块根目录,正确识别相对导入。

方案3:临时调整sys.path(应急用,不推荐)

如果不想改代码,也可以在commands.py最开头加一段代码,手动把app目录加入模块搜索路径:

import sys
from pathlib import Path
# 从commands.py所在目录向上跳三级,就是app目录
sys.path.append(str(Path(__file__).parent.parent.parent))

不过这种方式依赖文件路径结构,后续如果项目目录调整容易出问题,所以还是优先推荐前两个方案。

备注:内容来源于stack exchange,提问作者Javen

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.17 09:29:28