在Windows中解决PyQt4应用程序冻结问题的方法?
有没有一种可行且经过验证的方法可以在Windows上冻结一个pyqt4应用程序?我听说py2exe有一些问题。
1 个回答
我在工作中用py2exe做了一个PyQt4项目,但最后换成了PyInstaller。
总体来说,py2exe用得还不错。我记得我得手动在setup.py文件里告诉它要包含sip库,还有一些其他的库,这些都得根据程序来决定。相比之下,我觉得PyInstaller处理这些事情更好,虽然我常常发现自己需要从最终文件夹里的qt4_plugins文件夹中删除一些它自动加上的DLL文件,其实我并不需要。比如说,qt4_plugins\imageformats\qjpeg4.dll,但我根本不使用JPEG文件。这并不会影响到最终的应用程序,只是会增加文件的大小。
PyInstaller的手册也挺不错的,里面有个“入门指南”部分,你应该能很快把东西设置好。其实就是为每个项目创建一个.spec文件,这个文件会自动生成,但它也是一个普通的Python文件,所以你可以根据需要调整它,或者添加一些额外的任务,比如代码签名,或者用NSIS创建一个setup.exe程序。
我在路径里有一个名为pybuild.bat的Windows批处理文件,内容是:
python -O c:\python27\pyinstaller-1.5\build.py "%~f1"
这样我就可以通过命令行轻松构建项目,只需在项目的.spec文件上运行'pybuild projectname.spec'。我还把这个添加到了.spec文件的注册表项里,这样我就可以直接从资源管理器快速冻结一个项目:
Windows Registry Editor Version 5.00
[HKEY_CLASSES_ROOT\.SPEC\shell\Freeze\command]
@="C:\\Python27\\Scripts\\pybuild.bat \"%1\""
我换到PyInstaller的主要原因是,有些用户反映冻结的应用程序在他们的机器上无法运行。我总是遇到这样的错误:
应用程序启动失败,因为应用程序配置不正确。重新安装应用程序可能会解决这个问题。
但这个问题只出现在某些机器上,通常是运行Windows XP的。我发现让用户安装Microsoft Visual C++ 2008 Runtimes可以解决这个问题。
用PyInstaller创建的冻结应用程序没有这个问题,因为它似乎会把这些运行时打包到输出文件夹里。如果你的路径里有UPX,它还会压缩你的DLL和PYD文件,从而使输出文件夹更小。
总的来说,py2exe和PyInstaller都能正常工作。我在使用py2exe时遇到了一些问题,虽然可能有解决办法,但我发现PyInstaller在没有任何修改的情况下工作得更好。我用PyInstaller分发的冻结应用程序使用了PyQt4的图像和数据库库,还有一些其他的第三方库,到现在为止没有遇到任何问题。