2013-10-08 23 views
7

Tôi đã thực hiện trình soạn thảo mã đơn giản bằng cách sử dụng wxPython. Kích thước tệp (tệp python) là 1,3 KB. Nhưng khi tôi tạo tệp thực thi bằng PyInstaller, tôi nhận được 30 MB tệp! Có cách nào để giảm kích thước tệp không? Btw, tôi không nhập toàn bộ thư viện wx, chỉ các thành phần tôi cần (ví dụ: from wx import Frame).PyInstaller kích thước tệp rất lớn

Sử dụng Linux, Fedora 18 64bit.

Trả lời

5

wxPython là một thư viện lớn nên khi bạn tạo tệp thực thi, chúng có xu hướng kết thúc trong khoảng từ 20 đến 30 MB. Cũng lưu ý rằng Python chính nó là loại cồng kềnh vì Python là một ngôn ngữ diễn giải. Vì vậy, bạn cũng bao gồm trình thông dịch Python khi bạn tạo exe.

Với py2exe, tôi đã nhận được tệp thực thi dưới 10 MB, nhưng đó là một nỗi đau và không hoạt động cho tất cả các dự án. Nó thực sự phụ thuộc vào những gì khác bạn đang sử dụng. Bạn có thể đọc về cuộc phiêu lưu của tôi với py2exe here.

Cách khác để nhỏ hơn là sử dụng chương trình nén. Điều đó đôi khi hoạt động và đôi khi không.

Bạn cũng có thể nói hầu hết các công cụ tạo nhị phân này để loại trừ các mục. Bạn cũng có thể thử điều đó.

+0

Cảm ơn cho câu trả lời. Tôi sẽ cố gắng sử dụng UPX, hoặc tôi sẽ cố gắng viết lại chương trình của mình bằng C++ và sau đó biên dịch nó bằng gcc – JadedTuna

+0

Âm thanh như một kế hoạch. Chúc may mắn! –

3

Tôi đã gửi một ứng dụng wxPython khá đơn giản và kết thúc là ~ 9,8MB.

Nếu bạn sử dụng tập lệnh ArchiveViewer.py thuộc PyInstaller, bạn có thể xác định những gì chiếm quá nhiều không gian.

nầy cũng ở với python 2.7.5, mà không UPX, và loại trừ các phân hệ:

excludesPassedToAnalysis = ['ssl', 
'_ssl', 
# coverage uses _socket. :(
#'_socket', 
'select', 
'pywin', 
'unittest', 
'win32ui', 
'bz2', 
'doctest', 
'os2emxpath', 
'servicemanager', 
'xml.parsers.expat', 
'sitecustomize', 
'tarflie', 
'email', 
'urllib', 
'urllib2', 
# This exclude isn't optional in order to get pubsub working 
# correctly in wxPython 2.9.3 or later. 
'wx.lib.pubsub.autosetuppubsubv1'] 

# These are removed from a.pure after the Analysis object is created. 
excludeEncodings = \ 
['encodings.base_64_codec', 
'encodings.big5', 
'encodings.big5hkscs', 
'encodings.bz2_codec', 
'encodings.cp037', 
'encodings.cp1006', 
'encodings.cp1026', 
'encodings.cp1140', 
'encodings.cp1258', 
'encodings.cp424', 
'encodings.cp437', 
'encodings.cp500', 
'encodings.cp720', 
'encodings.cp737', 
'encodings.cp775', 
'encodings.cp850', 
'encodings.cp852', 
'encodings.cp855', 
'encodings.cp856', 
'encodings.cp857', 
'encodings.cp858', 
'encodings.cp860', 
'encodings.cp861', 
'encodings.cp862', 
'encodings.cp863', 
'encodings.cp864', 
'encodings.cp865', 
'encodings.cp866', 
'encodings.cp869', 
'encodings.cp874', 
'encodings.cp875', 
'encodings.cp932', 
'encodings.cp949', 
'encodings.cp950', 
'encodings.euc_jis_2004', 
'encodings.euc_jisx0213', 
'encodings.euc_jp', 
'encodings.euc_kr', 
'encodings.gb18030', 
'encodings.gb2312', 
'encodings.gbk', 
'encodings.hex_codec', 
'encodings.hp_roman8', 
'encodings.hz', 
'encodings.iso2022_jp', 
'encodings.iso2022_jp_1', 
'encodings.iso2022_jp_2', 
'encodings.iso2022_jp_2004', 
'encodings.iso2022_jp_3', 
'encodings.iso2022_jp_ext', 
'encodings.iso2022_kr', 
'encodings.iso8859_10', 
'encodings.iso8859_11', 
'encodings.iso8859_13', 
'encodings.iso8859_14', 
'encodings.iso8859_15', 
'encodings.iso8859_16', 
'encodings.iso8859_2', 
'encodings.iso8859_3', 
'encodings.iso8859_4', 
'encodings.iso8859_5', 
'encodings.iso8859_6', 
'encodings.iso8859_7', 
'encodings.iso8859_8', 
'encodings.iso8859_9', 
'encodings.johab', 
'encodings.koi8_r', 
'encodings.koi8_u', 
'encodings.mac_arabic', 
'encodings.mac_centeuro', 
'encodings.mac_croatian', 
'encodings.mac_cyrillic', 
'encodings.mac_farsi', 
'encodings.mac_greek', 
'encodings.mac_iceland', 
'encodings.mac_latin2', 
'encodings.mac_roman', 
'encodings.mac_romanian', 
'encodings.mac_turkish', 
'encodings.mbcs', 
'encodings.palmos', 
'encodings.ptcp154', 
'encodings.quopri_codec', 
'encodings.raw_unicode_escape', 
'encodings.rot_13', 
'encodings.shift_jis', 
'encodings.shift_jis_2004', 
'encodings.shift_jisx0213', 
'encodings.string_escape', 
'encodings.tis_620', 
'encodings.undefined', 
'encodings.utf_32', 
'encodings.utf_32_be', 
'encodings.utf_32_le', 
'encodings.utf_7', 
'encodings.uu_codec', 
'encodings.zlib_codec',] 
+0

Bạn có thể giải thích cách sử dụng pyi-archive_viewer để tìm phụ thuộc lớn nhất về kích thước không? Bởi vì tất cả tôi nhận được là một danh sách các tên: -/Ngoài ra, nơi nào bạn đặt hai danh sách loại trừ? Trong spec's loại trừ lĩnh vực? Bạn nối cả hai trước? – gaborous

+0

Tệp thông số không dễ truy cập vào lúc này, nhưng nếu tôi nhớ lại chính xác bạn sử dụng lệnh O cho trình xem pyi-archive-thì sẽ đổ ra dữ liệu bạn thấy trong phương thức hiển thị tại: https://github.com/pyinstaller/pyinstaller/blob/develop/PyInstaller/utils/cliutils/archive_viewer.py. –

+0

Loại trừ đầu tiên ở trên được chuyển vào cuộc gọi Phân tích. Danh sách loại trừ thứ hai như đã đề cập trong nhận xét là các tên mô-đun được xóa khỏi thuộc tính thuần túy của kết quả của cuộc gọi Phân tích. –

Các vấn đề liên quan