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

Python包内导入报错:ImportError: no module named 'project'

我太懂你这种明明照着网上方法试了却还是卡壳的烦躁了——明明结构看起来没问题,导入语句也按要求写了,结果偏偏报ImportError: no module named 'project',真的闹心。先帮你捋清楚问题根源,再给几个能落地的解决办法:

首先先确认下你的项目结构是不是这样(用代码块更清晰):

project/
└── project/
    ├── __init__.py
    ├── views.py
    └── modules.py

为什么你之前的方法没用?

大概率是两个常见坑:

  1. 运行方式不对:相对导入(比如from . import app)只能在「这个包被作为模块导入」时生效,如果你直接运行python __init__.py或者python views.py,Python会把当前脚本当成顶级模块,不认相对导入的语法。
  2. Python找不到你的包路径:你运行脚本时的工作目录可能没在正确的位置,或者外层project目录没被加入Python的搜索路径sys.path里,导致它识别不了project这个模块。

可行的解决方案

方案1:用模块方式运行脚本(最推荐)

切换到外层的project目录(也就是包含内层project文件夹的那个目录),然后用-m参数以模块形式运行你的脚本:
比如要运行views.py,就执行:

python -m project.views

这种方式会让Python自动把当前目录加入搜索路径,不管是相对导入还是绝对导入都能正常识别。

方案2:手动把包路径加入sys.path

如果不想每次都切换目录,或者需要在脚本里直接运行,可以在你的脚本开头加上这段代码,强行把外层project目录加入Python的搜索路径:

import sys
from pathlib import Path

# 获取外层project目录的绝对路径,加到sys.path里
sys.path.append(str(Path(__file__).parent.parent))

之后不管你用from . import app还是from project import app,都能正常找到模块了。

方案3:写一个单独的入口脚本

不要直接运行包内的文件,在外层project目录下新建一个run.py作为入口:

from project import app

if __name__ == "__main__":
    # 这里写你的启动逻辑,比如Flask的app.run()
    app.run()

然后直接在外层目录运行python run.py,这样完全避开了包内导入的各种坑,也是生产环境常用的方式。

额外提醒

别直接运行__init__.py文件!它的作用是标识这是一个Python包,不是用来直接执行的脚本。如果要测试__init__.py里的内容,通过入口脚本导入测试就好。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 06:19:06