AWS Elastic Beanstalk - Flask 应用程序无法导入自定义模块
Posted
技术标签:
【中文标题】AWS Elastic Beanstalk - Flask 应用程序无法导入自定义模块【英文标题】:AWS Elastic Beanstalk - Flask App Cannot Import Custom Module 【发布时间】:2019-09-23 14:31:12 【问题描述】:我正在尝试在 Python 3.6 中的 AWS Elastic Beanstalk 上托管一个 Flask 应用程序,但无论我尝试什么,应用程序的 url 都会导致 500:内部服务器错误。
我的应用结构如下:
myApp:
-application.py
-mytransformers.py
-requirements.txt
我查看了日志,但 wsgi 找不到我需要的包含自定义 Scikit-learn 转换器 (mytransformers.py) 的单独 python 脚本:
AttributeError: Can't get attribute 'MyTransformer' on <module '__main__' (built-in)>
我需要这些,因为我在一个 S3 存储库中腌制了 Scikit-learn 模型,我在 application.py
中导入了需要自定义转换器的模型。
我尝试将这些转换器定义移动到我的主 application.py
脚本,但它仍然返回相同的错误。
我认为wsgi脚本是找不到这些transformer定义的,我也没有发现太多有类似问题的人的方式。
编辑 1
我尝试将__init__.py
文件添加到我的应用程序目录中,但仍然遇到同样的错误。我想要做的是使用包含一些自定义转换器的 Pickle 加载 Scikit-Learn 管道,但是当我尝试加载它们时,它会抛出关于无法找到自定义转换器的错误,即使我在开始时导入了它们的脚本。我尝试将转换器的类定义放在application.py
脚本中,但这仍然不能解决错误。
编辑 2
我几乎可以肯定错误是在 EB 中使用 WSGI 来管理 Flask 应用程序。我的应用程序确实在本地运行,它只是似乎无法找到帮助函数的 WSGI。我发现了一篇使用 Azure 的类似帖子,其中有一个类似的 WSGI 找不到应用程序文件中定义的函数的问题: Error with WSGI when deploying Flask App to Azure
【问题讨论】:
有趣的注释:我遇到这个是因为如果 __name__ == "__main__": 没有为我执行...原来 __name__ 是 _mod_wsgi_c43d580a63001a918a0ca7939113f619。必须用 WSGI 管理 【参考方案1】:我首先将一个名为__init__.py
的空白文件添加到应用程序的根目录中。现在application.py
中的 Flask 应用程序无法检测到您的转换器,因为它们不在您的 python 路径上,并且它们不是同一个包的一部分。
添加 __init__.py
将使您的转换器可以使用以下方式导入:
from mytransformers import MyTransformer
因为它会将它们添加到应用程序包中。
编辑:它在本地运行吗?
【讨论】:
我尝试添加它,但它仍然不起作用,得到相同的cannot import module
错误。请参阅上面的编辑以上是关于AWS Elastic Beanstalk - Flask 应用程序无法导入自定义模块的主要内容,如果未能解决你的问题,请参考以下文章
AWS Elastic Beanstalk CLI 安装错误