ฉันสามารถสร้างไฟล์ exe ไฟล์เดียวโดยมีทรัพยากรทั้งหมดฝังลงในไฟล์ exe ฉันกำลังสร้างบน windows เพื่อที่จะอธิบายบางส่วนของ os.system โทรฉันกำลังใช้
ก่อนอื่นฉันพยายามแปลงภาพทั้งหมดของฉันให้เป็นบิตแมตและจากนั้นไฟล์ข้อมูลทั้งหมดของฉันเป็นสตริงข้อความ แต่สิ่งนี้ทำให้ exe สุดท้ายมีขนาดใหญ่มาก
หลังจาก googleing เป็นเวลาหนึ่งสัปดาห์ฉันก็หาวิธีเปลี่ยนสคริปต์ 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])
ทำให้พังถล่ม
script = py script ฉันต้องการเปลี่ยนเป็น 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!")
คำถามใด ๆ เสียค่าใช้จ่ายในการถาม