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

Flask部署Heroku时嵌套子文件夹文件导入失败求助

Flask项目本地正常但Heroku部署后模块导入失败

项目结构

__init__.py (空文件)
app.py
Procfile
sub1/
----__init__.py (空文件)
----sub2/
--------__init__.py (空文件)
--------file.py

代码片段

app.py

from sub1.sub2.file import Myclass
x = Myclass()

sub1/sub2/file.py

class Myclass():
    # Some code

Procfile

web: gunicorn app:app

部署后错误

首次推送后出现:

ModuleNotFoundError: No module named 'sub1.sub2.file'

尝试相对导入from .sub1.sub2.file import Myclass后出现:

ImportError: attempted relative import with no known parent package

后续调整导入结构后出现:

AttributeError: module 'sub1.sub2' has no attribute 'Myclass'

注:所有方案在本地执行python app.py或foreman start -f Procfile均正常。

已尝试的操作

  • 在app.py中使用import sub1 as sub1 + x = sub1.sub2.file.Myclass()
  • 在sub1/init.py添加from . import sub2
  • 在sub1/sub2/init.py添加from . import file
  • 将项目目录添加到sys.path:
    base_dir = os.path.dirname(os.path.abspath(__file__))
    sys.path.append(base_dir)
    sys.path.append(os.path.join(base_dir, 'sub1'))
    sys.path.append(os.path.join(base_dir, 'sub1', 'sub2'))
    from sub1.sub2.file import Myclass
    
  • 在app.py中使用from sub1 import sub2 + x = sub1.Myclass()
  • 在sub1/init.py添加from .sub2 import file
  • 在sub1/sub2/init.py添加from .file import Myclass

解决方案

1. 确认所有模块文件已提交到Git

检查.gitignore文件,确保没有忽略sub1目录或其中的.py文件。执行以下命令提交所有文件:

git add .
git commit -m "Add all module files"
git push heroku main

2. 统一本地与Heroku的Python版本

在项目根目录创建runtime.txt文件,写入与本地一致的Python版本(例如python-3.10.12),Heroku会自动使用该版本运行项目,避免版本差异导致的导入逻辑不一致。

3. 确保Flask实例正确定义

你的app.py中缺少Flask实例的定义,而Procfile中的gunicorn app:app是指向该实例。修改app.py:

import sys
import os
from flask import Flask

# 将项目根目录加入Python路径最前面
sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))

app = Flask(__name__)

from sub1.sub2.file import Myclass
x = Myclass()

if __name__ == "__main__":
    app.run()

4. 简化导入结构(可选)

如果上述方法仍未解决,可以调整包的导出逻辑:

  • 修改sub1/sub2/__init__.py:
    from .file import Myclass
    
  • 修改sub1/__init__.py:
    from .sub2 import Myclass
    
  • 然后在app.py中直接导入:
    from sub1 import Myclass
    x = Myclass()
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 14:50:56