Ich konnte eine einzelne Exe-Datei mit allen in die Exe eingebetteten Ressourcen erstellen. Ich baue auf Fenstern. Das erklärt einige der os.system-Aufrufe, die ich verwende.
Zuerst habe ich versucht, alle meine Bilder in Bitmats und dann alle meine Datendateien in Textzeichenfolgen zu konvertieren. Dies führte jedoch dazu, dass die endgültige Exe sehr, sehr groß war.
Nachdem ich eine Woche lang googelt hatte, fand ich heraus, wie ich das py2exe-Skript an meine Bedürfnisse anpassen kann.
Hier ist der Patch-Link zu SourceForge, den ich eingereicht habe. Bitte poste Kommentare, damit wir ihn in die nächste Distribution aufnehmen können.
http://sourceforge.net/tracker/index.php?func=detail&aid=3334760&group_id=15583&atid=315583
Dies erklärt alle vorgenommenen Änderungen. Ich habe einfach eine neue Option zur Setup-Zeile hinzugefügt. Hier ist meine setup.py.
Ich werde versuchen, es so gut wie möglich zu kommentieren. Bitte beachten Sie, dass meine setup.py komplex ist, da ich über den Dateinamen auf die Bilder zugreife. Also muss ich eine Liste speichern, um sie im Auge zu behalten.
Dies ist von einem Bildschirmschoner, den ich machen wollte.
Ich verwende exec, um mein Setup zur Laufzeit zu generieren. Es ist einfacher, es so auszuschneiden und einzufügen.
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])
Nervenzusammenbruch
script = py script Ich möchte mich an eine Exe wenden
icon_resources = das Symbol für die Exe
file_resources = Dateien, die ich in die exe einbetten möchte
other_resources = eine Zeichenfolge, die in die exe eingebettet werden soll, in diesem Fall eine Dateiliste.
options = py2exe Optionen zum Erstellen aller Elemente in einer exe-Datei
bitmap_strings = eine Liste der einzuschließenden Dateien
Bitte beachten Sie, dass file_resources keine gültige Option ist, bis Sie Ihre py2exe.py-Datei wie im obigen Link beschrieben bearbeiten.
Das erste Mal, dass ich versucht habe, Code auf dieser Seite zu posten, wenn ich es falsch verstehe, flamme mich nicht.
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, das ist es für die setup.py jetzt brauchte die Magie den Zugriff auf die Bilder. Ich habe diese App ohne py2exe entwickelt und später hinzugefügt. Sie sehen also den Zugriff für beide Situationen. Wenn der Bildordner nicht gefunden werden kann, wird versucht, die Bilder aus den exe-Ressourcen abzurufen. Der Code wird es erklären. Dies ist Teil meiner Sprite-Klasse und verwendet einen DirectX. Sie können jedoch jede gewünschte API verwenden oder einfach auf die Rohdaten zugreifen. spielt keine Rolle.
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!")
Fragen waren frei zu stellen.