He podido crear un único archivo exe con todos los recursos integrados en el exe. Estoy construyendo sobre ventanas. eso explicará algunas de las llamadas al sistema os que estoy usando.
Primero intenté convertir todas mis imágenes en bitmats y luego todos mis archivos de datos en cadenas de texto. pero esto causó que el exe final fuera muy, muy grande.
Después de googlear durante una semana, descubrí cómo alterar el script py2exe para satisfacer mis necesidades.
aquí está el enlace del parche en sourceforge que envié, publique comentarios para que podamos incluirlo en la próxima distribución.
http://sourceforge.net/tracker/index.php?func=detail&aid=3334760&group_id=15583&atid=315583
esto explica todos los cambios realizados, simplemente agregué una nueva opción a la línea de configuración. Aquí está mi setup.py.
Intentaré comentarlo lo mejor que pueda. Tenga en cuenta que mi setup.py es complejo debido al hecho de que tengo acceso a las imágenes por nombre de archivo. así que debo almacenar una lista para hacer un seguimiento de ellos.
Esto es de un protector de pantalla de querer b que estaba tratando de hacer.
Uso exec para generar mi configuración en tiempo de ejecución, es más fácil cortar y pegar así.
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])
Descompostura
script = script py quiero pasar a un exe
icon_resources = el icono para el exe
file_resources = archivos que quiero incrustar en el exe
other_resources = una cadena para incrustar en el exe, en este caso una lista de archivos.
opciones = opciones de py2exe para crear todo en un archivo exe
bitmap_strings = una lista de archivos para incluir
Tenga en cuenta que file_resources no es una opción válida hasta que edite su archivo py2exe.py como se describe en el enlace anterior.
La primera vez que intenté publicar código en este sitio, si me equivoco, no me llame.
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, eso es todo para el setup.py ahora la magia necesitaba acceder a las imágenes. Desarrollé esta aplicación sin py2exe en mente y luego la agregué más tarde. así verás acceso para ambas situaciones. Si no se encuentra la carpeta de imágenes, intenta extraer las imágenes de los recursos exe. El código lo explicará. esto es parte de mi clase de sprite y usa un directx. pero puede usar cualquier API que desee o simplemente acceder a los datos sin procesar. no 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!")
Cualquier pregunta fue libre de hacer.