pyopengl 3.0 is notoriously difficult to py2exe.

However, I was able to find this page, which suggests a possible 
solution:

http://blog.vrplumber.com/index.php?/archives/325-Got-py2exe-+-PyOpenGL-limping-across-the-line...-Need-to-add-the-.egg-files-to-the-path.html

---
James Paige

On Thu, Apr 22, 2010 at 07:08:43PM -0700, Keith Nemitz wrote:
> 
> I spent the day in py2exe hell. After grinding through six separate problems, 
> now I'm stuck. Has anyone got this combo to work? I'm using Python 2.6 and 
> Pygame 1.9.x and pyOpenGl 3.0.x and the latest py2exe. When I run the 
> resulting exe, I get the following runtime error:
> 
> Traceback (most recent call last):
>   File "main.py", line 29, in <module>
>   File "zipextimporter.pyo", line 82, in load_module
>   File "pygl2d\__init__.pyo", line 5, in <module>
>   File "zipextimporter.pyo", line 82, in load_module
>   File "pygl2d\window.pyo", line 3, in <module>
>   File ".\OpenGL\GL\__init__.py", line 2, in <module>
>     from OpenGL.raw.GL import *
>   File ".\OpenGL\raw\GL\__init__.py", line 6, in <module>
>     from OpenGL.raw.GL.constants import *
>   File ".\OpenGL\raw\GL\constants.py", line 7, in <module>
>     from OpenGL import platform, arrays
>   File ".\OpenGL\arrays\__init__.py", line 22, in <module>
>     formathandler.FormatHandler.loadAll()
>   File ".\OpenGL\arrays\formathandler.py", line 37, in loadAll
>     cls.loadPlugin( entrypoint )
>   File ".\OpenGL\arrays\formathandler.py", line 44, in loadPlugin
>     plugin_class = entrypoint.load()
>   File ".\OpenGL\plugins.py", line 14, in load
>     return importByName( self.import_path )
>   File ".\OpenGL\plugins.py", line 28, in importByName
>     module = __import__( ".".join(moduleName), {}, {}, moduleName)
>   File ".\OpenGL\arrays\strings.py", line 8, in <module>
>     psas = ctypes.pythonapi.PyString_AsString
>   File "ctypes\__init__.pyo", line 366, in __getattr__
>   File "ctypes\__init__.pyo", line 371, in __getitem__
> AttributeError: function 'PyString_AsString' not found
> 
> 
> 
> 
> Here is the script I'm currently using, based on the pygame wiki script:
> 
> 
> # This will create a dist directory containing the executable file, all the 
> data
> # directories. All Libraries will be bundled in executable file.
> #
> # Run the build process by entering 'pygame2exe.py' or
> # 'python pygame2exe.py' in a console prompt.
> #
> # To build exe, python, pygame, and py2exe have to be installed. After
> # building exe none of this libraries are needed.
>  
> try:
>     from distutils.core import setup
>     import py2exe, pygame
>     from modulefinder import Module
>     import glob, fnmatch
>     import sys, os, shutil
>     import operator    
> except ImportError, message:
>     raise SystemExit,  "Unable to load module. %s" % message
> 
> #---HACK
> origIsSystemDLL = py2exe.build_exe.isSystemDLL
> def isSystemDLL(pathname):
>        if os.path.basename(pathname).lower() in 
> ["sdl_ttf.dll","sdl_mixer.dll","libogg-0.dll"]:
>                return 0
>        return origIsSystemDLL(pathname)
> py2exe.build_exe.isSystemDLL = isSystemDLL
> #---ENDHACK
> 
> 
> class pygame2exe(py2exe.build_exe.py2exe): #This hack make sure that pygame 
> default font is copied: no need to modify code for specifying default font
>     def copy_extensions(self, extensions):
>         #Get pygame default font
>         pygamedir = os.path.split(pygame.base.__file__)[0]
>         pygame_default_font = os.path.join(pygamedir, 
> pygame.font.get_default_font())
>  
>         #Add font to list of extension to be copied
>         extensions.append(Module("pygame.font", pygame_default_font))
>         py2exe.build_exe.py2exe.copy_extensions(self, extensions)
>  
> class BuildExe:
>     def __init__(self):
>         #Name of starting .py
>         self.script = "main.py"
>  
>         #Name of program
>         self.project_name = "Around"
>  
>         #Project url
>         self.project_url = "about:none"
>  
>         #Version of program
>         self.project_version = "0.0.0.1"
>  
>         #License of the program
>         self.license = "MyApps License"
>  
>         #Auhor of program
>         self.author_name = "Keith Nemitz"
>         self.author_email = "musenik atya hoo doh com"
>         self.copyright = "Copyright (c) 2010 Keith Nemitz. All rights 
> reserved."
>  
>         #Description
>         self.project_description = "..."
>  
>         #Icon file (None will use pygame default icon)
>         self.icon_file = None
>  
>         #Extra files/dirs copied to game
>         self.extra_datas = 
> ["data","OpenGL","extras/Microsoft.VC90.CRT.manifest",
>                                     
> "extras/msvcm90.dll","extras/msvcp90.dll","extras/msvcr90.dll"]
>  
>         #Extra/excludes python modules
>         self.extra_modules = []
>         self.exclude_modules = ["OpenGL"]
>         
>         #DLL Excludes
>         self.exclude_dll = ['']
>  
>         #Zip file name (None will bundle files in exe instead of zip file)
>         self.zipfile_name = None
>  
>         #Dist directory
>         self.dist_dir ='dist'
>  
>     ## Code from DistUtils tutorial at 
> http://wiki.python.org/moin/Distutils/Tutorial
>     ## Originally borrowed from wxPython's setup and config files
>     def opj(self, *args):
>         path = os.path.join(*args)
>         return os.path.normpath(path)
>  
>     def find_data_files(self, srcdir, *wildcards, **kw):
>         # get a list of all files under the srcdir matching wildcards,
>         # returned in a format to be used for install_data
>         def walk_helper(arg, dirname, files):
>             if '.svn' in dirname:
>                 return
>             names = []
>             lst, wildcards = arg
>             for wc in wildcards:
>                 wc_name = self.opj(dirname, wc)
>                 for f in files:
>                     filename = self.opj(dirname, f)
>  
>                     if fnmatch.fnmatch(filename, wc_name) and not 
> os.path.isdir(filename):
>                         names.append(filename)
>             if names:
>                 lst.append( (dirname, names ) )
>  
>         file_list = []
>         recursive = kw.get('recursive', True)
>         if recursive:
>             os.path.walk(srcdir, walk_helper, (file_list, wildcards))
>         else:
>             walk_helper((file_list, wildcards),
>                         srcdir,
>                         [os.path.basename(f) for f in 
> glob.glob(self.opj(srcdir, '*'))])
>         return file_list
>  
>     def run(self):
>         if os.path.isdir(self.dist_dir): #Erase previous destination dir
>             shutil.rmtree(self.dist_dir)
>         
>         #Use the default pygame icon, if none given
>         if self.icon_file == None:
>             path = os.path.split(pygame.__file__)[0]
>             self.icon_file = os.path.join(path, 'pygame.ico')
>  
>         #List all data files to add
>         extra_datas = []
>         for data in self.extra_datas:
>             if os.path.isdir(data):
>                 extra_datas.extend(self.find_data_files(data, '*'))
>             else:
>                 extra_datas.append(('.', [data]))
>         
>         setup(
>             cmdclass = {'py2exe': pygame2exe},
>             version = self.project_version,
>             description = self.project_description,
>             name = self.project_name,
>             url = self.project_url,
>             author = self.author_name,
>             author_email = self.author_email,
>             license = self.license,
>  
>             # targets to build
>             windows = [{
>                 'script': self.script,
>                 'icon_resources': [(0, self.icon_file)],
>                 'copyright': self.copyright
>             }],
>             options = {'py2exe': {'optimize': 2, 'bundle_files': 1, 
> 'compressed': True, "includes": ["ctypes", "logging"],
>                                   'excludes': self.exclude_modules, 
> 'packages': self.extra_modules, 
>                                   'dll_excludes': self.exclude_dll} },
>             zipfile = self.zipfile_name,
>             data_files = extra_datas,
>             dist_dir = self.dist_dir
>             )
>         
>         if os.path.isdir('build'): #Clean up build dir
>             shutil.rmtree('build')
>  
> if __name__ == '__main__':
>     if operator.lt(len(sys.argv), 2):
>         sys.argv.append('py2exe')
>     BuildExe().run() #Run generation
>     raw_input("Press enter key to continue") #Pause to let user see that 
> things ends 
> 
> 

Reply via email to