2013-10-08 19 views
7

Ho realizzato un semplice editor di codice usando wxPython. La dimensione del file (file python) è di 1,3 KB. Ma quando creo un eseguibile usando PyInstaller, ottengo il file 30 MB! C'è un modo per ridurre le dimensioni del file? A proposito, non sto importando tutta la libreria wx, solo i componenti di cui ho bisogno (ex from wx import Frame).PyInstaller dimensioni file molto grandi

Utilizzo di Linux, Fedora 18 64 bit.

risposta

5

wxPython è una grande libreria, quindi quando si crea un eseguibile, tendono a finire tra 20 e 30 MB. Si noti inoltre che Python stesso è piuttosto ingombrante perché Python è un linguaggio interpretativo. Quindi stai anche includendo l'interprete Python quando crei l'exe.

Con py2exe, ho ottenuto l'eseguibile sotto i 10 MB, ma è un problema e non funziona per tutti i progetti. Dipende davvero da che altro stai usando. Puoi leggere le mie avventure con py2exe here.

L'altro modo per ridurlo è utilizzare un programma di compressione. A volte funziona e talvolta no.

È anche possibile indicare la maggior parte di questi strumenti di creazione binaria per escludere gli articoli. Puoi provare anche questo.

+0

Grazie per la risposta. Proverò ad usare UPX, o proverò a riscrivere il mio programma in C++ e poi lo compilerò usando gcc – JadedTuna

+0

Suoni come un piano. In bocca al lupo! –

3

Ho spedito una semplice app wxPython che ha raggiunto i 9,8 MB.

Se si utilizza lo script ArchiveViewer.py che fa parte di PyInstaller, è possibile determinare ciò che occupa molto spazio.

questo era con python 2.7.5, senza UPX, ed escludendo questi moduli:

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

Puoi spiegare come usare pyi-archive_viewer per trovare le maggiori dipendenze in termini di dimensioni? Perché tutto quello che ottengo è un elenco di nomi: -/Inoltre, dove metti i due elenchi di esclusione? Nel campo delle specifiche esclude? Concatenate entrambi in anticipo? – gaborous

+0

Al momento non è facile accedere al file delle specifiche, ma se ricordo correttamente si usa il comando O per pyi-archive-viewer che scaricherà i dati che vedi nel metodo show su: https://github.com/pyinstaller/pyinstaller/blob/develop/PyInstaller/utils/cliutils/archive_viewer.py. –

+0

La prima esclusione sopra riportata viene passata alla chiamata Analysis. Il secondo elenco di eccezioni come menzionato nel commento è i nomi dei moduli che vengono rimossi dalla proprietà pure del risultato della chiamata di Analysis. –