我用wxPython做了简单的代码编辑器。文件大小(python文件)是1.3 KB。但是当我使用PyInstaller创建可执行文件时,我得到了30 MB文件!有没有办法减小文件大小?顺便说一句,我没有进口整个wx图书馆,只有我需要的组件(例如from wx import Frame
)。PyInstaller非常大的文件大小
使用Linux,Fedora 18 64bit。
我用wxPython做了简单的代码编辑器。文件大小(python文件)是1.3 KB。但是当我使用PyInstaller创建可执行文件时,我得到了30 MB文件!有没有办法减小文件大小?顺便说一句,我没有进口整个wx图书馆,只有我需要的组件(例如from wx import Frame
)。PyInstaller非常大的文件大小
使用Linux,Fedora 18 64bit。
wxPython是一个很大的库,所以当你创建一个可执行文件时,它们往往会在20到30 MB之间。还要注意,Python本身有点笨重,因为Python是一种解释性语言。所以当你创建exe文件时你还包括Python解释器。
使用py2exe,我已经得到10 MB以下的可执行文件,但这是一个痛苦,并不适用于所有项目。这真的取决于你还在使用什么。你可以阅读我的冒险与py2exe here。
使其更小的另一种方法是使用压缩程序。这有时起作用,有时不起作用。
您还可以告诉大多数这些二进制创建工具排除项目。你也可以尝试。
我发布了一个相当简单的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',]
你能解释一下如何使用pyi-archive_viewer来查找最大的依赖关系吗?因为我所得到的是一个名称列表: - /另外,你在哪里放置两个排除列表?在规格的排除领域?你事先连接两个? – gaborous
目前规范文件并不容易获取,但如果我正确记得,您可以使用py命令来执行pyi-archive-viewer,然后转储出您在show方法中看到的数据:https:/ /github.com/pyinstaller/pyinstaller/blob/develop/PyInstaller/utils/cliutils/archive_viewer.py。 –
上面的第一个排除被传递给Analysis调用。在注释中提到的第二个排除列表是从Analysis调用的结果的纯属性中移除的模块名称。 –
感谢您的回答。我会尝试使用UPX,或者我会尝试用C++重新编写我的程序,然后使用gcc编译它 – JadedTuna
听起来像是一个计划。祝你好运! –