Python Forum
Thread Rating:
  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
Pygame to exe error
#1
I'm trying to compile a game that I've written to a windows executable.
I running python 3.7.4, pygame 1.9.6, and py2exe 0.9.2.2.
When I run the vanilla setup for py2exe I get all manner of errors.
After doing a bit of research I found a script that supposed to help compile pygame scripts, but it's written for python 2 and has a few issues: http://www.pygame.org/wiki/Pygame2exe?parent=CookBook

I made 2 modifications according to issues that others had and here is the modified 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.
#Please Note have a backup file in a different directory as if it crashes you 
#will loose it all!(I lost 6 months of work because I did not do this)


### try:
from distutils.core import setup
import py2exe, pygame
import py2exe.build_exe
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 which fixes the pygame mixer and pygame font
origIsSystemDLL = py2exe.build_exe.isSystemDLL # save the orginal before we edit it
def isSystemDLL(pathname):
    # checks if the freetype and ogg dll files are being included
    if os.path.basename(pathname).lower() in ("libfreetype-6.dll", "libogg-0.dll","sdl_ttf.dll"): # "sdl_ttf.dll" added by arit.
            return 0
    return origIsSystemDLL(pathname) # return the orginal function
py2exe.build_exe.isSystemDLL = isSystemDLL # override the default function with this one

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 = "table_06.py"

        #Name of program
        self.project_name = "MyApps"

        #Project url
        self.project_url = "about:none"

        #Version of program
        self.project_version = "0.0"

        #License of the program
        self.license = "MyApps License"

        #Auhor of program
        self.author_name = "Me"
        self.author_email = "[email protected]"
        self.copyright = "Copyright (c) 2009 Me."

        #Description
        self.project_description = "MyApps Description"

        #Icon file (None will use pygame default icon)
        self.icon_file = None

        #Extra files/dirs copied to game
        self.extra_datas = []

        #Extra/excludes python modules
        self.extra_modules = []
        self.exclude_modules = []
        
        #DLL Excludes
        self.exclude_dll = ['']
        #python scripts (strings) to be included, seperated by a comma
        self.extra_scripts = []

        #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, \
                                  'excludes': self.exclude_modules, 'packages': self.extra_modules, \
                                  'dll_excludes': self.exclude_dll,
                                  'includes': self.extra_scripts} },
            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 any key to continue") #Pause to let user see that things ends
Error:
Traceback (most recent call last): File "D:/Users/mikeo/Documents/Python Scripts/Multiplication table game/pygame2exe.py", line 33, in <module> 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 AttributeError: module 'py2exe.build_exe' has no attribute 'py2exe'
I've searched for a solution for this specific issue but could not find one.
I'm certain that this has nothing to do with my script because the calling line for the function on 33 is 141 and the script isn't accessed until 152.

One change that I made was adding line 16. If I remove it I get this error:
Error:
Traceback (most recent call last): File "D:/Users/mikeo/Documents/Python Scripts/Multiplication table game/pygame2exe.py", line 31, in <module> py2exe.build_exe.isSystemDLL = isSystemDLL # override the default function with this one AttributeError: module 'py2exe' has no attribute 'build_exe'
I think that's all of the information that I have. Any help would be appreciated. I'm not opposed to using a different module to build my exe.
Reply


Possibly Related Threads…
Thread Author Replies Views Last Post
  [PyGame] Pygame attribute error djwilson0495 3 3,937 Feb-18-2021, 03:34 PM
Last Post: michael1789
Big Grin Error installing Pygame-Zero dpa2007 1 3,173 Dec-26-2020, 03:50 PM
Last Post: MK_CodingSpace
  pygame error in my clicker game CrazyMakes 2 2,548 Apr-19-2020, 03:04 AM
Last Post: Windspar
  Error to install pygame skp 1 3,484 Apr-14-2020, 05:17 PM
Last Post: joe_momma
  installing pygame error pylab 1 4,261 Dec-31-2019, 05:44 PM
Last Post: pylab
  [PyGame] pygame image loading error BlueClaw 6 6,395 Dec-10-2019, 08:50 PM
Last Post: BlueClaw
  Problem with music - Pygame.error GaseBall 1 3,195 Nov-28-2019, 07:46 PM
Last Post: SheeppOSU
  [PyGame] Error setting up pygame wazee 10 13,310 Jun-14-2018, 11:19 PM
Last Post: wazee
  [pyGame] My First Test, Error Fount ! JamieVanCadsand 3 5,282 Sep-25-2017, 04:13 PM
Last Post: metulburr
  Pygame: Help With JackRouter Error arrangereality 4 5,066 Aug-02-2017, 03:28 AM
Last Post: arrangereality

Forum Jump:

User Panel Messages

Announcements
Announcement #1 8/1/2020
Announcement #2 8/2/2020
Announcement #3 8/6/2020