Python包内导入报错:ImportError: no module named 'project'
我太懂你这种明明照着网上方法试了却还是卡壳的烦躁了——明明结构看起来没问题,导入语句也按要求写了,结果偏偏报ImportError: no module named 'project',真的闹心。先帮你捋清楚问题根源,再给几个能落地的解决办法:
首先先确认下你的项目结构是不是这样(用代码块更清晰):
project/ └── project/ ├── __init__.py ├── views.py └── modules.py
为什么你之前的方法没用?
大概率是两个常见坑:
- 运行方式不对:相对导入(比如
from . import app)只能在「这个包被作为模块导入」时生效,如果你直接运行python __init__.py或者python views.py,Python会把当前脚本当成顶级模块,不认相对导入的语法。 - 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
相关产品推荐
相关产品推荐

