Python Flask 应用程序在本地运行,但在 Heroku 上托管时返回 AttributeError

2024-04-25

我正在开发大学申请。 该 Web 应用程序使用 joblib 加载给定模型,并且为了工作,它使用了 FlexibleScaler 类:

灵活.py

from sklearn.preprocessing import MinMaxScaler, StandardScaler, PowerTransformer, MaxAbsScaler, RobustScaler, Normalizer
from sklearn.base import BaseEstimator, TransformerMixin

class FlexibleScaler(BaseEstimator, TransformerMixin):
    def __init__(self, scaler=None):
        self.scaler = scaler
        self.check = False


    def __assign_scaler(self):
        if self.scaler == 'min-max':
            self.method = MinMaxScaler()
        elif self.scaler == 'standard':
            self.method = StandardScaler()
        elif self.scaler == 'yeo-johnson':
            self.method = PowerTransformer(method='yeo-johnson')
        elif self.scaler == 'box-cox':
            self.method = PowerTransformer(method='box-cox')
        elif self.scaler == 'max-abs':
            self.method = MaxAbsScaler()
        elif self.scaler == 'robust':
            self.method = RobustScaler()
        elif self.scaler == 'normalize':
            self.method = Normalizer()
        else:
            self.method = None
        self.check = True

    def fit_transform(self, X, y=None, **fit_params):
        if not self.check:
            self.__assign_scaler()
        if self.method is None:
            return X
        return self.method.fit_transform(X, y, **fit_params)

    def fit(self, X):
        if not self.check:
            self.__assign_scaler()
        if self.method is None:
            return X
        self.method.fit(X)

    def transform(self, X):
        if not self.check:
            self.__assign_scaler()
        if self.method is None:
            return X
        return self.method.transform(X)

烧瓶启动.py

from flask import Flask, Response, render_template, request, flash, redirect, session, g
import joblib
import pandas as pd
import numpy as np
from sklearn import datasets
from sklearn.ensemble import RandomForestClassifier
from sklearn.preprocessing import MinMaxScaler, StandardScaler, PowerTransformer, MaxAbsScaler, RobustScaler, Normalizer
from sklearn.base import BaseEstimator, TransformerMixin
from flexible import FlexibleScaler


UPLOAD_FOLDER = '/tmp/'
ALLOWED_EXTENSIONS = {'csv'}
app = Flask(__name__)

app.config['UPLOAD_FOLDER'] = UPLOAD_FOLDER
app.config['ALLOWED_EXTENSIONS'] = ALLOWED_EXTENSIONS


@app.route("/", methods=["POST", "GET"])
def home():

    if request.method == 'POST':

        //get data to process

        clf = joblib.load('ENS_fitted.joblib')

        prediction = clf.predict(features)
        pred_prob = clf.predict_proba(features)

        //do operations and return template

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

这一切都在本地运行。当我在 Heroku 上部署时,我在 joblib.load() 上收到以下错误:

Traceback (most recent call last):

2020-09-24T21:27:30.117559+00:00 app[web.1]:   File "/app/.heroku/python/lib/python3.8/site-packages/flask/app.py", line 2447, in wsgi_app

2020-09-24T21:27:30.117559+00:00 app[web.1]:     response = self.full_dispatch_request()

2020-09-24T21:27:30.117560+00:00 app[web.1]:   File "/app/.heroku/python/lib/python3.8/site-packages/flask/app.py", line 1952, in full_dispatch_request

2020-09-24T21:27:30.117560+00:00 app[web.1]:     rv = self.handle_user_exception(e)

2020-09-24T21:27:30.117561+00:00 app[web.1]:   File "/app/.heroku/python/lib/python3.8/site-packages/flask/app.py", line 1821, in handle_user_exception

2020-09-24T21:27:30.117561+00:00 app[web.1]:     reraise(exc_type, exc_value, tb)

2020-09-24T21:27:30.117561+00:00 app[web.1]:   File "/app/.heroku/python/lib/python3.8/site-packages/flask/_compat.py", line 39, in reraise

2020-09-24T21:27:30.117562+00:00 app[web.1]:     raise value

2020-09-24T21:27:30.117563+00:00 app[web.1]:   File "/app/.heroku/python/lib/python3.8/site-packages/flask/app.py", line 1950, in full_dispatch_request

2020-09-24T21:27:30.117563+00:00 app[web.1]:     rv = self.dispatch_request()

2020-09-24T21:27:30.117563+00:00 app[web.1]:   File "/app/.heroku/python/lib/python3.8/site-packages/flask/app.py", line 1936, in dispatch_request

2020-09-24T21:27:30.117564+00:00 app[web.1]:     return self.view_functions[rule.endpoint](**req.view_args)

2020-09-24T21:27:30.117564+00:00 app[web.1]:   File "/app/flask_start.py", line 138, in home

2020-09-24T21:27:30.117564+00:00 app[web.1]:     clf = joblib.load('ENS_fitted.joblib')

2020-09-24T21:27:30.117565+00:00 app[web.1]:   File "/app/.heroku/python/lib/python3.8/site-packages/joblib/numpy_pickle.py", line 585, in load

2020-09-24T21:27:30.117565+00:00 app[web.1]:     obj = _unpickle(fobj, filename, mmap_mode)

2020-09-24T21:27:30.117566+00:00 app[web.1]:   File "/app/.heroku/python/lib/python3.8/site-packages/joblib/numpy_pickle.py", line 504, in _unpickle

2020-09-24T21:27:30.117566+00:00 app[web.1]:     obj = unpickler.load()

2020-09-24T21:27:30.117567+00:00 app[web.1]:   File "/app/.heroku/python/lib/python3.8/pickle.py", line 1210, in load

2020-09-24T21:27:30.117570+00:00 app[web.1]:     dispatch[key[0]](self)

2020-09-24T21:27:30.117570+00:00 app[web.1]:   File "/app/.heroku/python/lib/python3.8/pickle.py", line 1526, in load_global

2020-09-24T21:27:30.117570+00:00 app[web.1]:     klass = self.find_class(module, name)

2020-09-24T21:27:30.117571+00:00 app[web.1]:   File "/app/.heroku/python/lib/python3.8/pickle.py", line 1581, in find_class

2020-09-24T21:27:30.117571+00:00 app[web.1]:     return getattr(sys.modules[module], name)

AttributeError: module '__main__' has no attribute 'FlexibleScaler'

我不明白为什么会发生这种情况。导入就在那里并且在本地工作。 我尝试将FlexibleScaler类直接复制到flask_start.py中(它也可以在本地运行),但没有成功。

local 和 Heroku 之间唯一的变化是,在 Heroku 上我使用 Gunicorn 来启动应用程序。

请提供任何帮助,我们将不胜感激。


看来joblib.save()产生的ENS_fitted.joblib发生在flask_start.py直接从 python 运行。当这种情况发生时,flask_start将有一个__name__ of "__main__"。那么,当joblib.save()pickles,它将把FlexibleScaler实例保存为__main__.FlexibleScaler.

但是当你在gunicorn下部署并运行时,flask_start将有一个__name__ of "flask_start"。这令人困惑joblib.load(),它期望找到一个__main__.FlexibleScaler,然后放弃,如上面所示。

解决方案是重新生成保存的模型,但这次通过调用flask_start via

% FLASK_APP=flask_start flask run

then joblib.save()再次,然后重新部署。

Updated

如果你绝对无法重新生成模型,你可以尝试这个技巧。进口后在flask_start.py, add

import __main__
__main__.FlexibleScalar = FlexibleScalar

你可以joblib.load()模型,否则您将在另一个类中遇到类似的错误,在这种情况下,请重复此技巧。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python Flask 应用程序在本地运行,但在 Heroku 上托管时返回 AttributeError 的相关文章

  • 如何下载 NLTK 数据?

    更新的答案 NLTK 适用于 2 7 我有3 2 我卸载了3 2并安装了2 7 现在可以了 我已经安装了 NLTK 并尝试下载 NLTK 数据 我所做的是按照该网站上的说明进行操作 http www nltk org data html h
  • 在 Python 3.5 64 位上通过 pip 安装 OpenCV

    我尝试安装 OpenCV 但找不到任何合适的 pip 软件包 我决定上网查找有关如何安装它的官方文档 并发现this https opencv python tutroals readthedocs io en latest py tuto
  • 如何在 Linux 上调用 Python 中的内联机器代码?

    我正在尝试从 Linux 上的纯 Python 代码调用内联机器代码 为此 我将代码嵌入到字节文字中 code b x55 x89 xe5 x5d xc3 然后打电话mprotect http www kernel org doc man
  • Redis SYNC 套接字上的错误情况:连接被拒绝

    在我的 django 应用程序中使用 celery 和 redis 一切都工作正常 直到我遇到了问题 redis 文件的位置已更改 redis 无法访问它们 经过查找 原来这是由于网络随机攻击造成的 需要添加confg 我添加文件后 一段时
  • 使用另一个索引数组正确索引多维 Numpy 数组

    我正在尝试索引多维数组P与另一个数组indices 它指定我想要沿最后一个轴的哪个元素 如下所示 import numpy as np M N 20 10 P np random rand M N 2 9 index into the la
  • Python 有哪些重要的语言特性(习语)需要尽早学习[重复]

    这个问题在这里已经有答案了 我有兴趣了解 StackOverflow 社区认为 Python 的重要语言特性 习语 是什么 将程序员定义为 Pythonic 的特征 Python pythonic 习语 Python 语言自然的或特有的 代
  • 在Python中修改大型文本文件最后一行的最有效方法

    我需要更新几个超过 2GB 的文件的最后一行 这些文件由无法读取的文本行组成readlines 目前 它可以通过逐行循环来正常工作 但是 我想知道是否有任何编译库可以更有效地实现这一点 谢谢 目前的方法 myfile open large
  • 使用 openCV 和 python 检测物体

    我正在尝试使用 OpenCV 和 Python 检测下图中的白点 我尝试使用函数 cv2 HoughCircles 但没有成功 我需要使用不同的方法吗 这是我的代码 import cv2 cv import numpy as np impo
  • 使用 PyQt4 在 QWidget 上进行 eventFilter

    我有一个 QMainWindow 其中包含DrawingPointsWidget 该小部件随机绘制红点 我通过使用以下命令为 MouseHovering 事件安装事件过滤器 在 QMainWindow 的状态栏中显示鼠标坐标self ins
  • Pandas 多索引数据框删除行

    我的多索引 DF 如下 tuples list zip a a b b c d c d index pd MultiIndex from tuples tuples names i1 i2 df pd DataFrame 5 6 7 8 i
  • 如何在 Python 中小写字符串?

    有没有办法将字符串转换为小写 Kilometers kilometers See How to change a string into uppercase https stackoverflow com questions 9257094
  • 如何让 list_blobs 表现得像 gsutil

    我只想获得 GCS 上假文件夹结构的第一级 如果我运行例如 gsutil ls gs gcp public data sentinel 2 tiles 我得到一个这样的列表 gs gcp public data sentinel 2 til
  • 如何使用 python / pywinusb 将 hid 数据发送到设备?

    我正在尝试使用 pywinusb 将输出报告发送到 pic18f4550 该设备可以接收数据 我已经使用 C 应用程序对其进行了测试 效果很好 另外 我可以使用 pywinusb 从设备读取数据 但我在尝试发送数据时遇到问题 这是我正在运行
  • pyspark:将 schemaRDD 保存为 json 文件

    我正在寻找一种将数据从 Apache Spark 以 JSON 格式导出到各种其他工具的方法 我认为一定有一种非常简单的方法来做到这一点 示例 我有以下 JSON 文件 jfile json key value a1 key2 value
  • numpy 沿第一个轴添加

    我想通过简单地沿第一个轴执行相同的加法来添加两个具有不同维度的数组 非矢量化解决方案 x np array 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 shape 4 3 2 y np a
  • 将 2D 数组中的每一列与另一个 2D 数组中的每一列相乘

    我有两个 Numpy 数组x有形状 m i and y有形状 m j 所以行数是相同的 我想将每一列相乘x每一列y逐元素 使结果具有形状 m i j Example import numpy as np np random seed 1 x
  • 如何提取Python代码文件中使用的函数?

    我想创建代码文件中使用的所有函数的列表 例如 如果我们在名为 add random py 的文件中有以下代码 import numpy as np from numpy import linalg def foo print np rand
  • Django - 在启动时执行代码

    我正在使用 Django 1 9 3 我有一个包含多个应用程序的项目 我想在项目启动时更新其中一个应用程序的表 用例 例如 假设我想在我的网站上销售商品 我有一个包含模型项目的应用程序 我在 Django 之外有一个网络服务 它提供服务 g
  • Python:从 apache authnz_ldap 获取用户

    我正在通过 Apache2 的 authnz ldap 模块成功验证 ldap 用户 我不清楚如何在他们登录后获取他们的用户名 以便我可以通过任何以下表单 网页与他们交互 我尝试过典型的方法 os getenv os environ get
  • Mac OS X 上的 Python 框架和非框架构建之间的差异

    Question Mac OS X 上的 Python 框架构建和非框架构建 即标准 UNIX 构建 之间有什么区别 另外 各自的优点和缺点是什么 初步研究 以下是我在发布此问题之前找到的信息 Pythonmac SIG Why is Fr

随机推荐