Tôi đã có thể tạo một tệp exe duy nhất với tất cả các tài nguyên được nhúng vào exe. Tôi đang xây dựng trên các cửa sổ. do đó sẽ giải thích một số cuộc gọi os.system tôi đang sử dụng.
Đầu tiên tôi đã thử chuyển đổi tất cả hình ảnh của mình thành bitmats và sau đó tất cả các tệp dữ liệu của tôi thành chuỗi văn bản. nhưng điều này gây ra exe cuối cùng là rất rất lớn.
Sau khi google được một tuần, tôi đã tìm ra cách thay đổi tập lệnh py2exe để đáp ứng nhu cầu của mình.
Đây là liên kết vá trên sourceforge tôi đã gửi, xin vui lòng gửi ý kiến để chúng tôi có thể đưa nó vào bản phân phối tiếp theo.
http://sourceforge.net/tracker/index.php?func=detail&aid=3334760&group_id=15583&atid=315583
Điều này khám phá tất cả các thay đổi được thực hiện, tôi chỉ cần thêm một tùy chọn mới vào dòng thiết lập. đây là setup.py của tôi.
tôi sẽ cố gắng bình luận nó tốt nhất có thể. Vui lòng biết rằng setup.py của tôi rất phức tạp với thực tế là tôi đang truy cập hình ảnh theo tên tệp. vì vậy tôi phải lưu trữ một danh sách để theo dõi chúng.
đây là từ trình bảo vệ màn hình muốn b mà tôi đang cố gắng thực hiện.
Tôi sử dụng exec để tạo thiết lập của tôi trong thời gian chạy, dễ dàng hơn để cắt và dán như vậy.
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])
phá vỡ
script = py script tôi muốn chuyển sang exe
icon_resource = biểu tượng cho exe
file_resource = tập tin tôi muốn nhúng vào exe
other_resource = một chuỗi để nhúng vào exe, trong trường hợp này là danh sách tệp.
Tùy chọn = tùy chọn py2exe để tạo mọi thứ vào một tệp exe
bitmap_strings = danh sách các tệp cần bao gồm
Xin lưu ý rằng file_resource không phải là một tùy chọn hợp lệ cho đến khi bạn chỉnh sửa tệp py2exe.py như được mô tả trong liên kết ở trên.
Lần đầu tiên tôi đã cố gắng đăng mã trên trang web này, nếu tôi hiểu sai, đừng làm phiền tôi.
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, đó là cho setup.py bây giờ phép thuật cần thiết để truy cập hình ảnh. Tôi đã phát triển ứng dụng này mà không có py2exe trong tâm trí và sau đó thêm nó sau. vì vậy bạn sẽ thấy quyền truy cập cho cả hai tình huống. nếu không thể tìm thấy thư mục hình ảnh, nó sẽ cố gắng kéo hình ảnh từ tài nguyên exe. mã sẽ giải thích nó. đây là một phần của lớp sprite của tôi và nó sử dụng directx. nhưng bạn có thể sử dụng bất kỳ api nào bạn muốn hoặc chỉ truy cập dữ liệu thô. không quan trọng
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!")
Bất kỳ câu hỏi rơi miễn phí để hỏi.