2013-10-08 93 views
7

我用wxPython做了简单的代码编辑器。文件大小(python文件)是1.3 KB。但是当我使用PyInstaller创建可执行文件时,我得到了30 MB文件!有没有办法减小文件大小?顺便说一句,我没有进口整个wx图书馆,只有我需要的组件(例如from wx import Frame)。PyInstaller非常大的文件大小

使用Linux,Fedora 18 64bit。

回答

5

wxPython是一个很大的库,所以当你创建一个可执行文件时,它们往往会在20到30 MB之间。还要注意,Python本身有点笨重,因为Python是一种解释性语言。所以当你创建exe文件时你还包括Python解释器。

使用py2exe,我已经得到10 MB以下的可执行文件,但这是一个痛苦,并不适用于所有项目。这真的取决于你还在使用什么。你可以阅读我的冒险与py2exe here

使其更小的另一种方法是使用压缩程序。这有时起作用,有时不起作用。

您还可以告诉大多数这些二进制创建工具排除项目。你也可以尝试。

+0

感谢您的回答。我会尝试使用UPX,或者我会尝试用C++重新编写我的程序,然后使用gcc编译它 – JadedTuna

+0

听起来像是一个计划。祝你好运! –

3

我发布了一个相当简单的wxPython应用程序,它的结果是〜9.8MB。

如果您使用PyInstaller的一部分的ArchiveViewer.py脚本,您可以确定占用这么多空间的是什么。

这与Python 2.7.5,不UPX,并排除这些模块:

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

你能解释一下如何使用pyi-archive_viewer来查找最大的依赖关系吗?因为我所得到的是一个名称列表: - /另外,你在哪里放置两个排除列表?在规格的排除领域?你事先连接两个? – gaborous

+0

目前规范文件并不容易获取,但如果我正确记得,您可以使用py命令来执行pyi-archive-viewer,然后转储出您在show方法中看到的数据:https:/ /github.com/pyinstaller/pyinstaller/blob/develop/PyInstaller/utils/cliutils/archive_viewer.py。 –

+0

上面的第一个排除被传递给Analysis调用。在注释中提到的第二个排除列表是从Analysis调用的结果的纯属性中移除的模块名称。 –