py2exe - generate single executable file

前端 未结 9 830
野的像风
野的像风 2020-11-22 01:45

I thought I heard that py2exe was able to do this, but I never figured it out. Has anyone successfully done this? Can I see your setup.py file, and what command line optio

相关标签:
9条回答
  • 2020-11-22 02:08

    You should create an installer, as mentioned before. Even though it is also possible to let py2exe bundle everything into a single executable, by setting bundle_files option to 1 and the zipfile keyword argument to None, I don't recommend this for PyGTK applications.

    That's because of GTK+ tries to load its data files (locals, themes, etc.) from the directory it was loaded from. So you have to make sure that the directory of your executable contains also the libraries used by GTK+ and the directories lib, share and etc from your installation of GTK+. Otherwise you will get problems running your application on a machine where GTK+ is not installed system-wide.

    For more details read my guide to py2exe for PyGTK applications. It also explains how to bundle everything, but GTK+.

    0 讨论(0)
  • 2020-11-22 02:08

    try c_x freeze it can create a good standalone

    0 讨论(0)
  • 2020-11-22 02:10

    No, it's doesn't give you a single executable in the sense that you only have one file afterwards - but you have a directory which contains everything you need for running your program, including an exe file.

    I just wrote this setup.py today. You only need to invoke python setup.py py2exe.

    0 讨论(0)
  • 2020-11-22 02:14

    I'm told bbfreeze will create a single file .EXE, and is newer than py2exe.

    0 讨论(0)
  • 2020-11-22 02:18

    I've been able to create a single exe file with all resources embeded into the exe. I'm building on windows. so that will explain some of the os.system calls i'm using.

    First I tried converting all my images into bitmats and then all my data files into text strings. but this caused the final exe to be very very large.

    After googleing for a week i figured out how to alter py2exe script to meet my needs.

    here is the patch link on sourceforge i submitted, please post comments so we can get it included in the next distribution.

    http://sourceforge.net/tracker/index.php?func=detail&aid=3334760&group_id=15583&atid=315583

    this explanes all the changes made, i've simply added a new option to the setup line. here is my setup.py.

    i'll try to comment it as best I can. Please know that my setup.py is complex do to the fact that i'm access the images by filename. so I must store a list to keep track of them.

    this is from a want-to-b screen saver I was trying to make.

    I use exec to generate my setup at run time, its easyer to cut and paste like that.

    exec "setup(console=[{'script': 'launcher.py', 'icon_resources': [(0, 'ICON.ico')],\
          'file_resources': [%s], 'other_resources': [(u'INDEX', 1, resource_string[:-1])]}],\
          options={'py2exe': py2exe_options},\
          zipfile = None )" % (bitmap_string[:-1])
    

    breakdown

    script = py script i want to turn to an exe

    icon_resources = the icon for the exe

    file_resources = files I want to embed into the exe

    other_resources = a string to embed into the exe, in this case a file list.

    options = py2exe options for creating everything into one exe file

    bitmap_strings = a list of files to include

    Please note that file_resources is not a valid option untill you edit your py2exe.py file as described in the link above.

    first time i've tried to post code on this site, if I get it wrong don't flame me.

    from distutils.core import setup
    import py2exe #@UnusedImport
    import os
    
    #delete the old build drive
    os.system("rmdir /s /q dist")
    
    #setup my option for single file output
    py2exe_options = dict( ascii=True,  # Exclude encodings
                           excludes=['_ssl',  # Exclude _ssl
                                     'pyreadline', 'difflib', 'doctest', 'locale',
                                     'optparse', 'pickle', 'calendar', 'pbd', 'unittest', 'inspect'],  # Exclude standard library
                           dll_excludes=['msvcr71.dll', 'w9xpopen.exe',
                                         'API-MS-Win-Core-LocalRegistry-L1-1-0.dll',
                                         'API-MS-Win-Core-ProcessThreads-L1-1-0.dll',
                                         'API-MS-Win-Security-Base-L1-1-0.dll',
                                         'KERNELBASE.dll',
                                         'POWRPROF.dll',
                                         ],
                           #compressed=None,  # Compress library.zip
                           bundle_files = 1,
                           optimize = 2                        
                           )
    
    #storage for the images
    bitmap_string = '' 
    resource_string = ''
    index = 0
    
    print "compile image list"                          
    
    for image_name in os.listdir('images/'):
        if image_name.endswith('.jpg'):
            bitmap_string += "( " + str(index+1) + "," + "'" + 'images/' + image_name + "'),"
            resource_string += image_name + " "
            index += 1
    
    print "Starting build\n"
    
    exec "setup(console=[{'script': 'launcher.py', 'icon_resources': [(0, 'ICON.ico')],\
          'file_resources': [%s], 'other_resources': [(u'INDEX', 1, resource_string[:-1])]}],\
          options={'py2exe': py2exe_options},\
          zipfile = None )" % (bitmap_string[:-1])
    
    print "Removing Trash"
    os.system("rmdir /s /q build")
    os.system("del /q *.pyc")
    print "Build Complete"
    

    ok, thats it for the setup.py now the magic needed access the images. I developed this app without py2exe in mind then added it later. so you'll see access for both situations. if the image folder can't be found it tries to pull the images from the exe resources. the code will explain it. this is part of my sprite class and it uses a directx. but you can use any api you want or just access the raw data. doesn't matter.

    def init(self):
        frame = self.env.frame
        use_resource_builtin = True
        if os.path.isdir(SPRITES_FOLDER):
            use_resource_builtin = False
        else:
            image_list = LoadResource(0, u'INDEX', 1).split(' ')
    
        for (model, file) in SPRITES.items():
            texture = POINTER(IDirect3DTexture9)()
            if use_resource_builtin: 
                data = LoadResource(0, win32con.RT_RCDATA, image_list.index(file)+1) #windll.kernel32.FindResourceW(hmod,typersc,idrsc)               
                d3dxdll.D3DXCreateTextureFromFileInMemory(frame.device,   #Pointer to an IDirect3DDevice9 interface
                                                  data,                #Pointer to the file in memory
                                                  len(data),           #Size of the file in memory
                                                  byref(texture))      #ppTexture
            else:
                d3dxdll.D3DXCreateTextureFromFileA(frame.device, #@UndefinedVariable
                                                   SPRITES_FOLDER + file,
                                                   byref(texture))            
            self.model_sprites[model] = texture
        #else:
        #    raise Exception("'sprites' folder is not present!")
    

    Any questions fell free to ask.

    0 讨论(0)
  • 2020-11-22 02:23

    PyInstaller will create a single .exe file with no dependencies; use the --onefile option. It does this by packing all the needed shared libs into the executable, and unpacking them before it runs, just as you describe (EDIT: py2exe also has this feature, see minty's answer)

    I use the version of PyInstaller from svn, since the latest release (1.3) is somewhat outdated. It's been working really well for an app which depends on PyQt, PyQwt, numpy, scipy and a few more.

    0 讨论(0)
提交回复
热议问题