尝试在 Flask 应用程序中取消模型时出现 ModuleNotFoundError

2024-04-20

Python版本:3.6.9

我用过pickle将机器学习模型转储到文件中,当我尝试使用 Flask 对其运行预测时,它失败了ModuleNotFoundError: No module named 'predictors'。我如何修复此错误,以便它识别我的模型,无论我尝试通过 Flask 还是通过 Python 命令运行预测(例如python predict_edu.py)?

这是我的文件结构:

 - video_discovery
   __init__.py
   - data_science
     - model
     - __init__.py
     - predict_edu.py
     - predictors.py
     - train_model.py

这是我的 Predict_edu.py 文件:

import pickle

with open('model', 'rb') as f:
        bow_model = pickle.load(f)

这是我的 Predictors.py 文件:

from sklearn.base import TransformerMixin

# Basic function to clean the text
def clean_text(text):
    # Removing spaces and converting text into lowercase
    return text.strip().lower()

# Custom transformer using spaCy
class predictor_transformer(TransformerMixin):
    def transform(self, X, **transform_params):
        # Cleaning Text
        return [clean_text(text) for text in X]

    def fit(self, X, y=None, **fit_params):
        return self

    def get_params(self, deep=True):
        return {}

以下是我训练模型的方法:

python data_science/train_model.py

这是我的 train_model.py 文件:

from predictors import predictor_transformer

# pipeline = Pipeline([("cleaner", predictor_transformer()), ('vectorizer', bow_vector), ('classifier', classifier_18p)])
pipeline = Pipeline([("cleaner", predictor_transformer())])

with open('model', 'wb') as f:
        pickle.dump(pipeline, f)

我的 Flask 应用程序位于:video_discovery/__init__.py

以下是我运行 Flask 应用程序的方式:

FLASK_ENV=development FLASK_APP=video_discovery flask run

我相信这个问题可能会发生,因为我通过直接运行 Python 脚本而不是使用 Flask 来训练模型,所以可能存在一些命名空间问题,但我不确定如何解决这个问题。训练我的模型需要一段时间,因此我无法完全等待 HTTP 请求。

我缺少什么可以解决这个问题?


执行时出现该错误似乎有点奇怪predict_edu.py,因为它与以下目录位于同一目录中predictors.py,因此,使用绝对导入,例如from predictors import predictor_transformer(没有点.操作员)应正常按预期工作。但是,如果错误仍然存​​在,您可以尝试以下几个选项。

Option 1

您可以添加的父目录predictors文件到系统PATH变量,在尝试导入模块之前,如所述here https://stackoverflow.com/a/71080756/17865804。这对于较小的项目应该可以正常工作。

import sys
from pathlib import Path
sys.path.insert(0, str(Path(__file__).resolve().parent))
from predictors import predictor_transformer

Option 2

使用相对导入,例如from .predictors import...,并确保从包的父目录运行脚本,如下所示。这-m option https://docs.python.org/3/using/cmdline.html#cmdoption-m“搜索sys.path https://docs.python.org/3/library/sys.html#sys.path对于指定的模块并执行其内容__main__ https://docs.python.org/3/library/__main__.html#module-__main__模块”,而不是作为顶级脚本。阅读有关-m以下参考文献中的选项:[1] https://docs.python.org/3/using/cmdline.html#cmdoption-m, [2] https://stackoverflow.com/questions/7610001/what-is-the-purpose-of-the-m-switch, [3] https://stackoverflow.com/questions/52441280/what-does-the-m-option-stand-for-in-python, [4] https://stackoverflow.com/questions/22241420/execution-of-python-code-with-m-option-or-not, [5] https://stackoverflow.com/questions/50821312/meaning-of-python-m-flag, [6] https://stackoverflow.com/questions/46319694/what-does-it-mean-to-run-library-module-as-a-script-with-the-m-option。在这里阅读有关“相对导入”的更多信息:[1] https://softwareengineering.stackexchange.com/questions/159503/whats-wrong-with-relative-imports-in-python, [2] https://stackoverflow.com/questions/1918539/can-anyone-explain-pythons-relative-imports, [3] https://stackoverflow.com/Questions/16981921/relative-imports-in-python-3, [4] https://stackoverflow.com/questions/14132789/relative-imports-for-the-billionth-time.

python -m video_discovery.data_science.predict_edu

但是,那PEP 8 风格指南 https://www.python.org/dev/peps/pep-0008/#imports一般情况下建议使用绝对导入。

建议绝对导入,因为它们通常更具可读性 并且往往表现得更好(或者至少给出更好的错误消息) 如果导入系统配置不正确(例如当 包内的目录最终位于 sys.path 上)

然而,在某些情况下,绝对导入可能会变得非常冗长,具体取决于目录结构的复杂性,如下所示。另一方面,“相对导入可能会很混乱,特别是对于目录结构可能发生变化的共享项目”。它们也“不如绝对的可读,并且很难判断导入资源的位置”。阅读更多关于Python导入 https://realpython.com/python-import/ and 绝对进口与相对进口 https://realpython.com/absolute-vs-relative-python-imports/.

from package1.subpackage2.subpackage3.subpackage4.module5 import function6

Option 3

将包含您的包目录的目录包含在PYTHONPATH https://docs.python.org/3/using/cmdline.html#envvar-PYTHONPATH并使用绝对导入代替。PYTHONPATH用于设置用户自定义模块的路径,以便可以直接导入到Python脚本中。这PYTHONPATH变量是一个字符串,其中包含需要添加到的目录列表sys.path https://docs.python.org/3/library/sys.html#sys.pathPython 的目录列表。该变量的主要用途是允许用户导入尚未制作成可安装的 Python 包的模块。了解更多相关信息here https://bic-berkeley.github.io/psych-214-fall-2016/using_pythonpath.html and here https://bic-berkeley.github.io/psych-214-fall-2016/sys_path.html.

例如,假设您有一个名为video_discovery (under /Users/my_user/code/video_discovery)并想添加目录/Users/my_user/code to the PYTHONPATH:

On Mac

  1. Open Terminal.app
  2. 打开文件~/.bash_profile在你的文本编辑器中 – 例如atom ~/.bash_profile
  3. 将以下行添加到末尾:export PYTHONPATH="/Users/my_user/code"
  4. 保存文件。
  5. Close Terminal.app
  6. Start Terminal.app再次读取新设置,然后输入echo $PYTHONPATH。它应该显示类似的内容/Users/my_user/code.

On Linux

  1. 打开您最喜欢的终端程序

  2. 打开文件~/.bashrc在你的文本编辑器中 – 例如atom ~/.bashrc

  3. 将以下行添加到末尾:export PYTHONPATH=/home/my_user/code

  4. 保存文件。

  5. 关闭您的终端应用程序。

  6. 再次启动终端应用程序,读取新设置, 并输入echo $PYTHONPATH。它应该显示类似的内容/home/my_user/code.

在 Windows 上

  1. Open This PC (or Computer),在内部右键单击并选择Properties.
  2. 从计算机属性对话框中,选择Advanced system settings在左侧。
  3. 从高级系统设置对话框中,选择Environment variables button.
  4. 在环境变量对话框中,单击New button 在里面 对话框的上半部分,制作一个新的用户变量:
  5. 给出变量name as PYTHONPATH and in value添加路径到 你的模块目录。选择OK and OK再次保存该变量。
  6. 现在打开一个cmd窗口并输入echo %PYTHONPATH%确认环境变量设置正确。Remember打开一个新的 cmd 窗口来运行您的 Python 程序,以便它选择以下位置的新设置PYTHONPATH.

Option 4

另一种解决方案是以可编辑状态安装软件包(对 .py 文件所做的所有编辑将自动包含在已安装的软件包中),如下所述here https://stackoverflow.com/a/50193944 and here https://stackoverflow.com/a/50194143。但是,要使其发挥作用所需的工作量可能会使选项 3 成为您更好的选择。

内容为setup.py应该如下图所示,安装包的命令应该是pip install -e . (-eflag 代表“可编辑”并且.代表“当前目录”)。

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

尝试在 Flask 应用程序中取消模型时出现 ModuleNotFoundError 的相关文章

随机推荐