Windows上のPython3でpyOpenGLを使う
PyOpenGL-3.0.2a2.zip
を
> C:\Python32\python setup.py install
したら特に修正しなくても動いた
2012/01/20追記
- Windows7 64bit
- python3.2 32bit
でpyOpenGLを使う段取りのメモ。
まず、普通にpython3.2をインストール。
http://pyopengl.sourceforge.net/
からPyOpenGL 3.0.2a1とPyOpenGL-Demo-3.0.1b1.zipをダウンロードしてくる。
PyOpenGLをインストールしてから、Demoを解凍して実行してみると
>gears.py File "C:\PyOpenGL-Demo-3.0.1b1\PyOpenGL-Demo\GLUT\gears.py ", line 126 print "%.0f frames in %3.1f seconds = %6.3f FPS" % (frames,seconds,fps) ^ SyntaxError: invalid syntax
とか出てしまう。python3とpython2の非互換エラーです。最初手で一個ずつ直していたのだが自動でやるスクリプトがpython3に付属しているのでそれを使うべし。
> C:\Python32\Tools\Scripts\2to3.py -w PyOpenGL-Demo-3.0.1b1
ディレクトリを指定すると中のファイルが対象になり、-wオプションがついているとファイルの書き換えを実行する。
デモがpython3対応になったので実行してみる。
>gears.py Traceback (most recent call last): File "C:\PyOpenGL-Demo-3.0.1b1\PyOpenGL-Demo\GLUT\gears.py ", line 9, in <module> from OpenGL.GL import * File "C:\Python32\lib\site-packages\OpenGL\GL\__init__.py", line 2, in <module> from OpenGL.raw.GL import * File "C:\Python32\lib\site-packages\OpenGL\raw\GL\__init__.py", line 6, in <module> from OpenGL.raw.GL.constants import * File "C:\Python32\lib\site-packages\OpenGL\raw\GL\constants.py", line 7, in <module> from OpenGL import platform, arrays File "C:\Python32\lib\site-packages\OpenGL\platform\__init__.py", line 36, in <module> _load() File "C:\Python32\lib\site-packages\OpenGL\platform\__init__.py", line 27, in _load plugin_class = plugin.load() File "C:\Python32\lib\site-packages\OpenGL\plugins.py", line 14, in load return importByName( self.import_path ) File "C:\Python32\lib\site-packages\OpenGL\plugins.py", line 28, in importByName module = __import__( ".".join(moduleName), {}, {}, moduleName) File "C:\Python32\lib\site-packages\OpenGL\platform\win32.py", line 21 except OSError, err: ^ SyntaxError: invalid syntax
pyOpenGLもpython2で書かれております。
pyOpenGLも2to3.pyする。
> cd C:\Python32\Lib\site-packages > C:\Python32\Tools\Scripts\2to3.py -w OpenGL
実行
C:\PyOpenGL-Demo-3.0.1b1\PyOpenGL-Demo\GLUT>gears.py Traceback (most recent call last): File "C:\PyOpenGL-Demo-3.0.1b1\PyOpenGL-Demo\GLUT\gears.py ", line 258, in <module> glutInit(sys.argv) File "C:\Python32\lib\site-packages\OpenGL\GLUT\special.py", line 324, in glut Init _base_glutInit( ctypes.byref(count), holder ) TypeError: 'NoneType' object is not callable
glutのdllが無い。
http://www.xmission.com/~nate/glut.html
からglut-3.7.6-bin.zipをもらってきて、
C:\Windows\SysWOW64\glut32.dll
にコピー。
実行
C:\PyOpenGL-Demo-3.0.1b1\PyOpenGL-Demo\GLUT>gears.py Traceback (most recent call last): File "C:\PyOpenGL-Demo-3.0.1b1\PyOpenGL-Demo\GLUT\gears.py", line 263, in <module> glutCreateWindow("pyGears") File "C:\Python32\lib\site-packages\OpenGL\GLUT\special.py", line 71, in glutCreateWindow return __glutCreateWindowWithExit(title, _exitfunc) ctypes.ArgumentError: argument 1: <class 'TypeError'>: wrong type
dllは見つかった。しばらく悩んだがgear.pyに次の修正をしたら動いた。
glutCreateWindow("pyGears".encode("cp932"))
Python3のstrはunicodeになったが、そのせいでctypesではchar*に変換してくれなくなったのか。
以上で、glut動作確認。