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 安装错误

text AWS Elastic Beanstalk

HTTPS Elastic Beanstalk (AWS) 到 Android

AWS Elastic Beanstalk 无法担任角色

AWS Elastic Beanstalk

AWS Elastic Beanstalk chown PythonPath 错误