J'ai pu créer un seul fichier exe avec toutes les ressources intégrées dans l'exe. Je construis sous Windows, ce qui explique certains des appels système os.que j'utilise.
J'ai d'abord essayé de convertir toutes mes images en bitmats, puis tous mes fichiers de données en chaînes de texte. Mais cela a fait en sorte que l'exe final soit très très grand.
Après avoir cherché sur Google pendant une semaine, j'ai trouvé comment modifier py2exe script pour répondre à mes besoins.
voici le lien du patch sur sourceforge que j'ai soumis, merci de poster des commentaires afin que nous puissions l'inclure dans la dans la prochaine distribution.
http://sourceforge.net/tracker/index.php?func=detail&aid=3334760&group_id=15583&atid=315583
ceci explique tous les changements effectués, j'ai simplement ajouté une nouvelle option à la ligne setup. Voici mon setup.py.
Je vais essayer de le commenter du mieux que je peux. Sachez que mon setup.py est complexe du fait que j'accède aux images par nom de fichier. Je dois donc stocker une liste pour en garder la trace.
ça vient d'un écran de veille que j'essayais de faire.
J'utilise exec pour générer ma configuration au moment de l'exécution, c'est plus facile de couper et coller comme ça.
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])
ventilation
script = py script je veux transformer en un exe.
icon_resources = l'icône de l'exe
file_resources = fichiers que je veux intégrer dans l'exe
other_resources = une chaîne à intégrer dans l'exe, dans ce cas une liste de fichiers.
options = options de py2exe pour tout créer dans un seul fichier exe
bitmap_strings = une liste de fichiers à inclure
Veuillez noter que file_resources n'est pas une option valide tant que vous n'avez pas modifié votre fichier py2exe.py comme décrit dans le lien ci-dessus.
C'est la première fois que j'essaye de poster un code sur ce site, si je me trompe, ne m'en voulez pas.
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, c'est tout pour le setup.py maintenant la magie nécessaire pour accéder aux images. J'ai développé cette application sans py2exe à l'esprit puis je l'ai ajouté plus tard. donc vous verrez l'accès pour les deux situations. si le dossier d'image ne peut pas être trouvé il essaie de tirer les images des ressources de l'exe. le code l'expliquera. ceci fait partie de ma classe de sprite et utilise un directx. mais vous pouvez utiliser n'importe quelle api que vous voulez ou juste accéder aux données brutes. cela n'a pas d'importance.
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!")
N'hésitez pas à poser vos questions.
1 votes
Cela s'applique-t-il à Python 3, ou aux versions postérieures à Python 2 ?