Windows上のPython3でpyOpenGLを使う

PyOpenGL-3.0.2a2.zip

> C:\Python32\python setup.py install

したら特に修正しなくても動いた

2012/01/20追記



で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動作確認。