Sono stato in grado di creare un singolo file exe con tutte le risorse incorporate nell'exe. Sto costruendo su Windows. così che spiegherà alcune delle chiamate os.system che sto usando.
Prima ho provato a convertire tutte le mie immagini in bitmats e poi tutti i miei file di dati in stringhe di testo. ma ciò causò l'exe finale molto grande.
Dopo aver cercato su Google per una settimana, ho capito come modificare lo script py2exe per soddisfare le mie esigenze.
ecco il link della patch su sourceforge che ho inviato, si prega di inviare commenti in modo che possiamo includerlo nella prossima distribuzione.
http://sourceforge.net/tracker/index.php?func=detail&aid=3334760&group_id=15583&atid=315583
questo spiega tutte le modifiche apportate, ho semplicemente aggiunto una nuova opzione alla riga di installazione. ecco il mio setup.py.
cercherò di commentarlo nel miglior modo possibile. Tieni presente che il mio setup.py è complesso, per il fatto che accedo alle immagini tramite il nome file. quindi devo memorizzare un elenco per tenerne traccia.
questo è da uno screen saver che volevo b che stavo cercando di fare.
Uso exec per generare il mio setup in fase di esecuzione, è più facile tagliarlo e incollarlo in quel modo.
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])
abbattersi
script = py script voglio passare a un exe
icon_resources = l'icona per l'exe
file_resources = file che voglio incorporare nell'esempio
other_resources = una stringa da incorporare nell'exe, in questo caso un elenco di file.
options = py2exe opzioni per la creazione di tutto in un file exe
bitmap_strings = un elenco di file da includere
Si noti che file_resources non è un'opzione valida fino a quando non si modifica il file py2exe.py come descritto nel collegamento sopra.
la prima volta che ho provato a pubblicare il codice su questo sito, se sbaglio non mi eccitare.
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, questo è tutto per setup.py ora la magia necessaria per accedere alle immagini. Ho sviluppato questa app senza py2exe e poi l'ho aggiunta in seguito. quindi vedrai l'accesso per entrambe le situazioni. se non è possibile trovare la cartella delle immagini, tenta di estrarre le immagini dalle risorse exe. il codice lo spiegherà. questo fa parte della mia classe sprite e usa un directx. ma puoi usare qualsiasi API tu voglia o semplicemente accedere ai dati grezzi. non importa.
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!")
Qualsiasi domanda è libera di porre.