2011/11/18

windows7(32bit) pyOpenGLの実行ファイルをpy2exeで作成する

py2exeがうまくいかないしよくわからなかった。

昨日インストールしたpyOpenGLでは
C:\Python26\Lib\site-packages配下にOpenGLフォルダが
無かった(py2exeするのにOpenGLフォルダの中のファイルをコピーする必要がありそうだし、昨日のインストールではOpenGLフォルダがどこにあるかわからなかった)ので
ココを参考に再度pyOpenGLを入れてみることにした。
サイト内に書かれているsetuptoolsについては昨日も書いた通り
すでに入っているので飛ばした。

ページ内のリンクからPyOpenGL-3.0を入手した。
zipだったので展開して展開したフォルダの中に移動して
python setup.py install
を実行した。

C:\Python26\Lib\site-packages配下にOpenGLフォルダができた。

py2exeで実行ファイルを作るのはココを参考にした。

実際の作業は以下の通り。

OpenGLを使ったソースファイル↓
sample3.py
-------------------------------
import sys
sys.path.insert( 0, '.' )

from OpenGL.GL import *
from OpenGL.GLUT import *
from OpenGL.GLU import *
import sys

ESCAPE = '\033'
lastx = x = 30
lasty = y = 30

def initialize():
glClearDepth(1.0)
glEnable(GL_DEPTH_TEST)
glClearColor(0.0, 0.5, 0.0, 0.0)
glShadeModel(GL_SMOOTH)

glMatrixMode(GL_PROJECTION)
glFrustum(-0.5, 0.5, -0.5, 0.5, 1.0, 3.0)
glMatrixMode(GL_MODELVIEW)

glTranslatef(0.0, 0.0, -2.0)
glRotatef(y, 1.0, 0.0, 0.0)
glRotatef(x, 0.0, 1.0, 0.0)
glEnable(GL_LIGHTING)
glEnable(GL_LIGHT0)
glColorMaterial(GL_FRONT_AND_BACK, GL_DIFFUSE)
glEnable(GL_COLOR_MATERIAL)

def mouseMotion(x, y):
global lastx, lasty
lastx = x
lasty = y
glutPostRedisplay()

def display():
global lastx, lasty
glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT )
glPushMatrix()
glRotatef(lastx, 0.0, 1.0, 0.0)
glRotatef(lasty, 1.0, 0.0, 0.0)

glBegin(GL_QUADS)
glNormal3f( 0.0, 0.0, 1.0)
glVertex3f( 0.5, 0.5, 0.5)
glVertex3f(-0.5, 0.5, 0.5)
glVertex3f(-0.5,-0.5, 0.5)
glVertex3f( 0.5,-0.5, 0.5)

glNormal3f( 0.0, 0.0,-1.0)
glVertex3f(-0.5,-0.5,-0.5)
glVertex3f(-0.5, 0.5,-0.5)
glVertex3f( 0.5, 0.5,-0.5)
glVertex3f( 0.5,-0.5,-0.5)

glNormal3f( 0.0, 1.0, 0.0)
glVertex3f( 0.5, 0.5, 0.5)
glVertex3f( 0.5, 0.5,-0.5)
glVertex3f(-0.5, 0.5,-0.5)
glVertex3f(-0.5, 0.5, 0.5)

glNormal3f( 0.0,-1.0, 0.0)
glVertex3f(-0.5,-0.5,-0.5)
glVertex3f( 0.5,-0.5,-0.5)
glVertex3f( 0.5,-0.5, 0.5)
glVertex3f(-0.5,-0.5, 0.5)

glNormal3f( 1.0, 0.0, 0.0)
glVertex3f( 0.5, 0.5, 0.5)
glVertex3f( 0.5,-0.5, 0.5)
glVertex3f( 0.5,-0.5,-0.5)
glVertex3f( 0.5, 0.5,-0.5)

glNormal3f(-1.0, 0.0, 0.0)
glVertex3f(-0.5,-0.5,-0.5)
glVertex3f(-0.5,-0.5, 0.5)
glVertex3f(-0.5, 0.5, 0.5)
glVertex3f(-0.5, 0.5,-0.5)
glEnd()

glPopMatrix()
glutSwapBuffers()

def keyboard(*args):
if args[0] == ESCAPE:
sys.exit()

def reshape(w, h):
glViewport(0, 0, w, h)

def main():
glutInit(sys.argv)

glutInitDisplayMode( GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH )
glutInitWindowPosition( 100, 100 )
glutInitWindowSize( 500, 400 )
glutCreateWindow( sys.argv[0] )

glutDisplayFunc( display )
glutKeyboardFunc( keyboard )
glutReshapeFunc( reshape )
glutMotionFunc( mouseMotion )

initialize()

glutMainLoop()

print "Hit ESC key to quit."
main()
-------------------------------


py2exeで使用するsetup.pyは下記の通り。
----------------------------------
from distutils.core import setup
import py2exe

setup(windows=["sample3.py"],
options={"py2exe": {"includes": ["ctypes", "logging"],
"excludes": ["OpenGL"],
}
}
)
----------------------------------

実行はpython setup.py py2exe

下記のフォルダをpy2exeで作成されたdistフォルダにコピー
C:\Python26\Lib\site-packages\OpenGL
C:\Python26\Lib\ctypes

下記のフォルダ内のファイルのみ(Libフォルダ内のフォルダはいらない)も
distフォルダにコピー
C:\Python26\Lib

上記を毎回やるのは面倒なのでバッチファイルを作成して行う。
バッチファイルは下記の通り。
---------------------------------
rmdir /s build
rmdir /s dist

python setup.py py2exe

mkdir .\dist\OpenGL
xcopy C:\Python26\Lib\site-packages\OpenGL .\dist\OpenGL /e

mkdir .\dist\ctypes
xcopy C:\Python26\Lib\ctypes .\dist\ctypes /e

copy C:\Python26\Lib .\dist

pause
---------------------------------

作成されたdistファイルを他のマシン(windowsXP32bit)に持って行っても
動いた。