使用vispy/scipy时无法冻结应用程序
我有一个应用程序,里面加了一个模块,用来用 vispy
和 scipy
(用于 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 个回答
我们还没有认真考虑过用Vispy来冻结应用程序。根据gmas80的回答,我预期会遇到一个问题:Vispy可以使用多种后端,这意味着这些后端是动态加载的,而cx_Freeze无法将这些后端模块作为依赖项来选择。根据你需要的后端,你需要在vispy.backends
中添加一些模块到包含列表里。
我尝试只冻结出现问题的模块,方法是添加一个带有 QApplication
的 main
,这个 main
会显示包含 vispy.app.canvas
的 QWidget
。这样做有帮助,因为我得到了一个非常有用的错误回溯,和 vispy.app.backends._pyside
有关。
在我明确将这个添加到我发布的 cx_freeze
脚本后,冻结的应用程序就能正常工作了:
packages = ['osgeo._gdal', 'vispy.app.backends._pyside', 'scipy.sparse.csgraph._validation']
我在构建目录中发现的不同之处是出现了 QtOpenGL4.dll
和 PySide.QtOpenGL.pyd
。如果没有明确包含这些包,它们是不会出现的(我的应用程序已经在使用 PySide)。