尝试用PyInstaller打包Python代码(使用了wxPython和pyOpenGL)的时候,遇到一系列的问题,汇总一下:
环境:
Win7 64-bit, PyInstaller 2.0, Python 2.7.5, wxPython 2.8.12.1, pyOpenGL 3.0.2
问题1:
PyInstaller打包成功,运行dist里生成的exe文件时,提示下面错误:
"... OpenGL.GLUT.special", line 322, in glutInit
TypeError: 'NoneType' object is not callable
原因:
pyOpenGL相关的DLL文件没有自动copy到exe所在的目录
解决办法:
把pyOpenGL的DLL文件 (通常在Lib\site-packages\OpenGL\DLLS下面), copy到exe所在目录
问题2:
PyInstaller打包成功,运行dist里生成的exe文件时,提示下面错误:
AttributeError: 'module' object has no attribute 'GL_READ_WRITE'
原因:
pyInstaller 2.0 不能直接支持 pyOpenGL 3.0.1和pyOpenGL3.0.2
解决办法:
使用pyOpelGL 3.0.1b
http://sourceforge.net/projects/pyopengl/files/PyOpenGL/3.0.1b1/
参考: http://*.com/questions/11011373/pyopengl-exe-made-with-pyinstaller-gives-attributeerror
问题3:
PyInstaller打包成功,运行dist里生成的exe文件时,提示下面错误:
ImportError: cannot import name Publisher
原因:
wxPython中包含pubsub多个不同的版本(所谓的v1和v3), wxPython如果使用v1版本实现的publisher, PyInstaller不能正常工作。
解决办法:
1. 保留v1版本的pubsub, 使用hook (参考http://www.pyinstaller.org/ticket/312)。 这个方法我没有试过。
2. 使用v3版本的pubsub。
参考: http://wiki.wxpython.org/WxLibPubSub#PubSub_within_wx.lib