我试图在Python 3.6的AWS Elastic Beanstalk上托管Flask应用程序,但是无论我如何尝试,该应用程序的URL都会导致500:Internal Server Error。
我的应用程序的结构如下:
myApp:
-application.py
-mytransformers.py
-requirements.txt
我查看了日志,wsgi找不到我需要的单独的python脚本,其中包含自定义Scikit-learn转换器(mytransformers.py):
AttributeError: Can't get attribute 'MyTransformer' on <module '__main__' (built-in)>
我需要这些,因为我在application.py
导入的S3存储库中腌制了Scikit学习模型,该模型需要自定义转换器。
我试图将这些转换器定义移至我的主要application.py
脚本中,但仍返回相同的错误。
我认为wsgi脚本无法找到这些转换器定义,并且对于遇到类似问题的人来说,我也没有找到太多。
编辑1
我尝试将__init__.py
文件添加到我的应用程序目录中,但仍然遇到相同的错误。我要执行的操作是使用包含一些自定义转换器的Pickle加载Scikit-Learn管道,但是当我尝试加载它们时,即使我在开始时就导入了它们,也会出现无法找到自定义转换器的错误。的脚本。我尝试将转换器的类定义放在application.py
脚本中,但这仍然不能解决错误。
编辑2
我几乎可以肯定,错误是使用WSGI管理Flask应用程序的EB。我的应用程序确实在本地运行,只是WSGI似乎无法找到帮助程序功能。我使用Azure找到了类似的帖子,但遇到类似的WSGI问题,但找不到在应用程序文件中定义的功能: Error with WSGI when deploying Flask App to Azure
答案 0 :(得分:0)
我首先将一个名为__init__.py
的空白文件添加到应用程序的根目录。现在,application.py
中的Flask应用无法检测到您的转换器,因为它们不在您的python路径上,并且它们不属于同一软件包。
添加__init__.py
将使您的变压器可以使用以下设备导入:
from mytransformers import MyTransformer
,因为它将把它们添加到应用程序包中。
编辑:它是否在本地运行?