2014-02-13 2 views
0

Я попытался использовать py2exe, чтобы выполнить исполняемый файл моего проекта PyOpenGL, и я это сделал ... Проблема в том, что он не работает ... Exe не работает, и я получаю этот журнал:py2exe и PyOpenGL

Traceback (most recent call last): 
File "gl.py", line 1, in <module> 
ImportError: No module named OpenGL.GL 

setup.py выглядит следующим образом:

from distutils.core import setup 
import py2exe 

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

Мой проект выглядит следующим образом:

from OpenGL.GL import * 
from OpenGL.GLU import * 
import random 
from math import * 

import pygame 

import Image 
import sys 
import time 


sys.path += ['.'] 


pygame.init() 
pygame.display.set_mode((800,600), pygame.OPENGL|pygame.DOUBLEBUF) 

def jpg_file_write(name, number, data): 
    im = Image.frombuffer("RGBA", (800,600), data, "raw", "RGBA", 0, 0) 
    fnumber = "%05d" % number 
    im.save(name + fnumber + ".jpg") 


glEnable(GL_DEPTH_TEST) 


def createAndCompileShader(type,source): 
    shader=glCreateShader(type) 
    glShaderSource(shader,source) 
    glCompileShader(shader) 



    result=glGetShaderiv(shader,GL_COMPILE_STATUS) 

    if (result!=1): 
     raise Exception("Greska u kompajliranju... \nLog:\n"+glGetShaderInfoLog(shader)) 
    return shader 


vertex_shader=createAndCompileShader(GL_VERTEX_SHADER,""" 
varying vec3 v; 
varying vec3 N; 

void main(void) 
{ 

    v = gl_ModelViewMatrix * gl_Vertex; 
    N = gl_NormalMatrix * gl_Normal; 

    gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex; 

} 
"""); 

fragment_shader=createAndCompileShader(GL_FRAGMENT_SHADER,""" 
varying vec3 N; 
varying vec3 v; 

void main(void) 
{ 
    vec3 L = gl_LightSource[0].position.xyz-v; 

    // "Lambert's law"? (see notes) 
    // Rather: faces will appear dimmer when struck in an acute angle 
    // distance attenuation 

    float Idiff = max(dot(normalize(L),N),0.0)*pow(length(L),-2.0); 

    gl_FragColor = vec4(0.5,0,0.5,1.0)+ // purple 
        vec4(1.0,1.0,1.0,1.0)*Idiff; // diffuse reflection 
} 
"""); 



program=glCreateProgram() 
glAttachShader(program,vertex_shader) 
glAttachShader(program,fragment_shader) 
glLinkProgram(program) 


try: 
    glUseProgram(program) 
except OpenGL.error.GLError: 
    print glGetProgramInfoLog(program) 
    raise 

done = False 

t=0 



glNewList(1,GL_COMPILE) 

glBegin(GL_QUADS) 

glColor3f(1,1,1) 

glNormal3f(0,0,-1) 
glVertex3f(-1, -1, -1) 
glVertex3f( 1, -1, -1) 
glVertex3f( 1, 1, -1) 
glVertex3f(-1, 1, -1) 

glNormal3f(0,0,1) 
glVertex3f(-1, -1, 1) 
glVertex3f( 1, -1, 1) 
glVertex3f( 1, 1, 1) 
glVertex3f(-1, 1, 1) 

glNormal3f(0,-1,0) 
glVertex3f(-1, -1, -1) 
glVertex3f( 1, -1, -1) 
glVertex3f( 1, -1, 1) 
glVertex3f(-1, -1, 1) 

glNormal3f(0,1,0) 
glVertex3f(-1, 1, -1) 
glVertex3f( 1, 1, -1) 
glVertex3f( 1, 1, 1) 
glVertex3f(-1, 1, 1) 

glNormal3f(-1,0,0)  
glVertex3f(-1, -1, -1) 
glVertex3f(-1, 1, -1) 
glVertex3f(-1, 1, 1) 
glVertex3f(-1, -1, 1)      

glNormal3f(1,0,0)   
glVertex3f( 1, -1, -1) 
glVertex3f( 1, 1, -1) 
glVertex3f( 1, 1, 1) 
glVertex3f( 1, -1, 1) 

glEnd() 
glEndList() 

while not done: 

    t=t+1 

    glMatrixMode(GL_PROJECTION) 
    glLoadIdentity() 
    gluPerspective(90,1,0.01,1000) 
    gluLookAt(sin(t/260.0)*4,cos(t/260.0)*4,cos(t/687.0)*3,0,0,0,0,1,0) 

    glClearColor(0.0, 0.0, 0.0, 1.0) 
    glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT) 

    glMatrixMode(GL_MODELVIEW) 



    ld=[sin(t/16.0)*4.0,sin(t/20.0)*4.0,cos(t/16.0)*4.0] 



    glLightfv(GL_LIGHT0,GL_POSITION,[ld[0],ld[1],ld[2]]); 



    glColor3f(1,1,1) 

    glLoadIdentity() 


    for i in range(-5,5): 
     for j in range(-5,5): 
      for k in range(-5,5): 
       glPushMatrix() 

       glTranslate(i,j,k) 
       glScale(0.1,0.1,0.1) 
       glCallList(1) 
       glPopMatrix() 

    pygame.display.flip() 

кто-нибудь знает, что может быть с используя эту проблему?

ответ

1

Когда вы исключаете пакет в py2exe, вам необходимо вручную добавить его в результирующий каталог «dist». То есть вы скопируете весь пакет OpenGL из каталога сайтов-пакетов в каталог py2exe dist.

Я провел эксперимент с PyOpenGL 3.1.0b2 и py2exe с использованием явных включений, таких как только те части PyOpenGL, которые вы используете, включены. Результаты записываются в blog post. Для ваших целей (с использованием Pygame) вам не нужно беспокоиться о нехватке DLL GLUT/GLE, а на реальной машине Win32 она может работать как ожидалось (тесты не удались на моей виртуальной машине).