Мені вдалося створити єдиний файл EXE з усіма ресурсами, вбудованими в exe. Я будую на вікнах. щоб пояснити деякі виклики ОС.системи, які я використовую.
Спочатку я спробував перетворити всі свої зображення в бітові, а потім усі мої файли даних у текстові рядки. але це призвело до того, що остаточний exe був дуже великим.
Після гугл протягом тижня я зрозумів, як змінити скрипт py2exe, щоб задовольнити мої потреби.
ось посилання на патч на sourceforge, який я подав, будь ласка, публікуйте коментарі, щоб ми могли включити його до наступного розповсюдження.
http://sourceforge.net/tracker/index.php?func=detail&aid=3334760&group_id=15583&atid=315583
це пояснює всі внесені зміни, я просто додав нову опцію до лінії настройки. ось мій setup.py.
Я спробую прокоментувати це якнайкраще. Будь ласка, знайте, що мій setup.py є складним, щоб зробити доступ до зображень за назвою файлу. тому я повинен зберігати список, щоб їх відстежувати.
це від заставки, яку я хотів зробити, щоб я намагався зробити.
Я використовую exec для генерації моїх налаштувань під час виконання програми, її програвач легко вирізати та вставити.
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])
зламатися
Я хочу звернутися до EXE
icon_resources = значок для EXE
file_resources = файли, які я хочу вставити в програму EXE
other_resources = рядок для вбудовування в exe, у цьому випадку список файлів.
options = py2exe параметри для створення всього в одному файлі EXE
bitmap_strings = список файлів, які слід включити
Зауважте, що file_resources не є дійсною опцією, поки ви не редагуєте файл py2exe.py, як описано у посиланні вище.
Перший раз я спробував розмістити код на цьому сайті, якщо я помиляюсь, не спалахуйте мене.
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"
Гаразд, це для setup.py тепер потрібна магія доступу до зображень. Я розробив цю програму без py2exe на увазі, потім додав її пізніше. тож ви побачите доступ для обох ситуацій. якщо папку зображень неможливо знайти, вона намагається витягнути зображення з ресурсів exe. код пояснить це. це частина мого класу спрайт, і він використовує directx. але ви можете використовувати будь-яку api, яку ви хочете, або просто отримати доступ до необроблених даних. не має значення.
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!")
Будь-які запитання можна було задавати.