Udało mi się utworzyć pojedynczy plik exe ze wszystkimi zasobami osadzonymi w exe. Buduję na oknach. więc to wyjaśni niektóre z wywołań os.system, których używam.
Najpierw spróbowałem przekonwertować wszystkie moje obrazy na bitmaty, a następnie wszystkie moje pliki danych na ciągi tekstowe. ale to spowodowało, że końcowy exe był bardzo duży.
Po tygodniowym wyszukiwaniu w Google zorientowałem się, jak dostosować skrypt py2exe do moich potrzeb.
tutaj jest link do łatki na sourceforge, które przesłałem, proszę o komentarze, abyśmy mogli je dołączyć do następnej dystrybucji.
http://sourceforge.net/tracker/index.php?func=detail&aid=3334760&group_id=15583&atid=315583
to wyjaśnia wszystkie wprowadzone zmiany, po prostu dodałem nową opcję do linii ustawień. tutaj jest mój setup.py.
Postaram się to skomentować najlepiej jak potrafię. Pamiętaj, że mój plik setup.py jest skomplikowany, ponieważ mam dostęp do obrazów według nazwy pliku. więc muszę przechowywać listę, aby je śledzić.
pochodzi z wygaszacza ekranu, który chciałem zrobić.
Używam exec do generowania mojej konfiguracji w czasie wykonywania, łatwiej jest wycinać i wklejać w ten sposób.
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])
awaria
script = py script Chcę przejść do exe
icon_resources = ikona pliku exe
file_resources = pliki, które chcę osadzić w exe
other_resources = ciąg do osadzenia w exe, w tym przypadku lista plików.
options = py2exe opcje tworzenia wszystkiego w jednym pliku exe
bitmap_strings = lista plików do dołączenia
Pamiętaj, że file_resources nie jest prawidłową opcją, dopóki nie zmodyfikujesz pliku py2exe.py, jak opisano w powyższym linku.
Gdy pierwszy raz próbowałem wysłać kod na tej stronie, jeśli się pomylę, nie pal mnie.
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, to wszystko dla setup.py teraz magia potrzebowała dostępu do obrazów. Opracowałem tę aplikację bez uwzględnienia py2exe, a następnie dodałem ją później. więc zobaczysz dostęp dla obu sytuacji. jeśli nie można znaleźć folderu obrazów, próbuje pobrać obrazy z zasobów exe. kod wyjaśni to. jest to część mojej klasy sprite'a i używa directx. ale możesz użyć dowolnego interfejsu API lub po prostu uzyskać dostęp do surowych danych. nie ma znaczenia.
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!")
Wszelkie pytania nie wahały się zadawać.