使用vispy/scipy时无法冻结应用程序

2 投票
2 回答
530 浏览
提问于 2025-04-29 14:16

我有一个应用程序,里面加了一个模块,用来用 vispyscipy(用于 Delaunay)来绘制数据。这个模块在我用 Python 解释器(Windows 上的 3.4 x64)运行时没问题,但用 cx_freeze 冻结后就不行了。它没有给我任何错误信息,就是安静地不运行。

这是我的 cx_freeze 脚本:

buildOptions = dict(packages = ['osgeo._gdal', 'scipy.sparse.csgraph._validation'])

import sys
base = 'Win32GUI' if sys.platform=='win32' else None

executables = [
    Executable('main.py', base=base, targetName = 'myApp.exe', icon='ico/myApp.ico')
    ]

setup(name='MyApp',
  version = '0.0.1',
  description = 'My fancy app',
  author = 'xxxx@xxxx.xxx',
  options = dict(build_exe = buildOptions),
  executables = executables)

我需要添加 'scipy.sparse.csgraph._validation' 来修复之前缺失的包含,正如这里所建议的:scipy 与 py2exe这里

我在寻找 DLL 问题时,已经尝试过用 Dependency Walker,但没有找到解决办法。

如果我把使用 vispy 绘图的模块注释掉,其他一切都正常。有没有什么建议?

暂无标签

2 个回答

1

我们还没有认真考虑过用Vispy来冻结应用程序。根据gmas80的回答,我预期会遇到一个问题:Vispy可以使用多种后端,这意味着这些后端是动态加载的,而cx_Freeze无法将这些后端模块作为依赖项来选择。根据你需要的后端,你需要在vispy.backends中添加一些模块到包含列表里。

2

我尝试只冻结出现问题的模块,方法是添加一个带有 QApplicationmain,这个 main 会显示包含 vispy.app.canvasQWidget。这样做有帮助,因为我得到了一个非常有用的错误回溯,和 vispy.app.backends._pyside 有关。

在我明确将这个添加到我发布的 cx_freeze 脚本后,冻结的应用程序就能正常工作了:

packages = ['osgeo._gdal', 'vispy.app.backends._pyside', 'scipy.sparse.csgraph._validation']

我在构建目录中发现的不同之处是出现了 QtOpenGL4.dllPySide.QtOpenGL.pyd。如果没有明确包含这些包,它们是不会出现的(我的应用程序已经在使用 PySide)。

撰写回答