在 Flask 中使用 cPickle 时出现 ImportError

ImportError while using cPickle with Flask

在为 python class 创建对象实例后,例如:

inst = ClassName(var1, var2)

注意:我需要 pickle dump,因为实例的创建是一次性任务,需要很长时间。

我做了 cPickle 转储:

with open("filename.pickle", "w") as output_file:
    cPickle.dump(inst, output_file)

现在,当我将它作为一个普通的 python 程序执行时(使用文件中的 cPickle.load 并使用 'python' 命令),它完美地工作:

with open("filename.pickle", "r") as input_file:
    final_inst = cPickle.load(input_file)

但是,当我在 Flask 路由中编写相同的代码时,我得到:

ImportError: No module named ClassName

我需要 final_inst 才能继续

非常感谢任何帮助。提前致谢!

从代码片段中有点难以分辨,但 pickle 将依赖于全局变量中加载的模块。 class 应该先导入全局范围,然后再将数据解压回 class ClassName

确保将 ClassName 导入到与加载函数相同的 space 中。在烧瓶中 - 相同的文件很好。你应该导入 class 是绝对的。

from other import ClassName

def some_function():
    with open("filename.pickle", "r") as input_file:
        final_inst = cPickle.load(input_file)
    return FlaskResponse('Thing')

@csevier 继续!这是一个导入错误。谢谢! 首先,我使用以下命令在 python 控制台中获取了 ClassName 的绝对路径: 导入 os 导入类名 os.path.abspath(类名.文件)

之后,我在加载之前添加了以下代码: 导入系统 sys.path.append('path/to/ClassName')

这纯粹是一个导入问题。包含 class 名称的模块未被导入,因为 python 不知道如何找到 it.It 很可能 flask 应用程序 运行 在一个 venv 中它指向不同的站点包目录或类似的东西。简单的故障排除步骤是将工作模块中的 sys.path 列表与非工作模块中的列表进行比较:import sys.path print(sys.path),您也可以 运行每个查看它在驱动器上的物理位置: print(module_class_name_is_imported_from.file)