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
相关产品推荐
相关产品推荐

