He podido crear un solo archivo exe con todos los recursos incrustados en el exe. Estoy construyendo en Windows. entonces eso explicará algunas de las llamadas al sistema operativo 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 hizo que el exe final fuera muy grande.
Después de buscar en Google durante una semana descubrí cómo alterar la secuencia de comandos py2exe para satisfacer mis necesidades.
aquí está el parche de sourceforge que envié, por favor 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
este explanes todos los cambios realizados, simplemente he añadido una nueva opción para 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 para el 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 want-to-b que estaba tratando de hacer.
Utilizo exec para generar mi configuración en tiempo de ejecución, es más fácil de cortar y pegar de esa manera.
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])
desglose
script = guión py quiero dar vuelta a un exe
icon_resources = el icono del exe
file_resources = Archivos quiero integrar en el exe
other_resources = una cadena para incrustar en el exe, en este caso una lista de archivos.
opciones = Opciones py2exe para la creación de 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 usted edite su archivo como se describe py2exe.py en el enlace de arriba
primera vez que he tratado de publicar el código en este sitio, si lo hago mal 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"
bien, eso es todo para el setup.py ahora la magia necesita acceder a las imágenes. Desarrollé esta aplicación sin py2exe en mente y luego la agregué más tarde. para que pueda ver el acceso en ambas situaciones. si no se puede encontrar 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 brutos. 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 es gratuita.
se aplica esto a Python 3, o versiones posteriores a pitón 2? – Vincent