使用 cx_freeze 时如何加载泡菜模型?

Posted

技术标签:

【中文标题】使用 cx_freeze 时如何加载泡菜模型?【英文标题】:How do I load a pickle model when using cx_freeze? 【发布时间】:2020-05-26 05:34:51 【问题描述】:

作为应用程序构建的脚本在尝试加载 pickle 模型数据时停止工作。以下是有问题的代码:

with open('model_pickle','rb') as f:
    mp = pickle.load(f)

这是我正在使用的设置文件:

setup(
    name="Test",
    version="1.0",
    options="build_exe":"include_files":["model_pickle"],
    executables=[target]
)

程序在执行 python 脚本时正常运行。但是,通过cx_freeze 将其转换为可执行文件后,问题在于打开泡菜模型数据文件。我已经在有数据和没有数据的情况下对此进行了测试,所以我很确定这是问题所在。

【问题讨论】:

【参考方案1】:

您可以按如下方式导入模型model = pickle.load(open('MODEL_PATH','rb'))。希望这会奏效!

【讨论】:

【参考方案2】:

我 99.99% 肯定,您还需要将 model_pickle 文件作为包数据添加到您的 setup(…) 调用中,以使其作为可执行文件运行。这是一个 setup.pysn-p 显示包数据选项:

from setuptools import setup, find_packages

PROJECT_NAME = 'my_project' # this should reflect your package structure

setup(
    # …
    packages=[package for package in find_packages() \
                       if package.startswith(PROJECT_NAME)],

    package_dir= 'my_project' : 'my_project' ,
    package_data= '' : ['*.*'] ,
    include_package_data=True,
    zip_safe=True,
    # …
)

另外,如果我是你,我会将数据文件重命名为 model_pickle.pkl,这样你的 package_data 表达式就不必使用双通配符(如上)。

如果这不能立即奏效,我还建议 adding a MANIFEST.in file 明确命名您的二进制数据文件。

【讨论】:

【参考方案3】:

您是否使用 IDLE 测试过您的程序?可能存在pickle 解码错误...如果没有,请尝试使用此code 创建您的exe。它会导入您计算机上的所有库。它更长,但更容易:只需运行一个文件。


无论如何,更好的用户 PyInstaller(也是 PyPI 上可用的一个模块)-Related Stack Overflow answer

【讨论】:

以上是关于使用 cx_freeze 时如何加载泡菜模型?的主要内容,如果未能解决你的问题,请参考以下文章

加载泡菜 NotFittedError:TfidfVectorizer - 未安装词汇

加载或倾倒泡菜时如何阻止动画 QCursor 冻结?

如何通过保存经过训练的模型来减少使用 pickle 的编译时间?

如何从 S3 加载泡菜文件以在 AWS Lambda 中使用?

无法为 Pascal VOC 泡菜数据集加载泡菜

Python泡菜错误:UnicodeDecodeError