PyInstaller的文件大小非常大

7
我使用wxPython制作了一个简单的代码编辑器。文件大小(Python文件)为1.3 KB。但是当我使用PyInstaller创建可执行文件时,我得到了30 MB的文件!有没有办法减小文件大小?顺便说一下,我没有导入整个wx库,只导入我需要的组件(例如from wx import Frame)。
使用Linux,Fedora 18 64位。
2个回答

6
wxPython是一个庞大的库,因此当你创建可执行文件时,它们往往会达到20到30MB之间。此外,请注意Python本身有点臃肿,因为它是一种解释性语言。所以创建exe文件时,您也会包含Python解释器。
使用py2exe可以将可执行文件缩小到10MB以下,但这很繁琐,并且并不适用于所有项目。这真的取决于你使用了什么其他东西。您可以在这里阅读我的py2exe经历。
将其压缩也是另一种缩小文件大小的方法。这有时有效,有时无效。
您还可以告诉大多数二进制文件创建工具要排除某些项。您也可以尝试这样做。

谢谢你的回答。我会尝试使用UPX,或者尝试将我的程序重新编写为C++并使用gcc进行编译。 - JadedTuna
听起来不错。祝你好运! - Mike Driscoll

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',]

你能否解释一下如何使用pyi-archive_viewer查找最大的依赖项?因为我只得到了一个名称列表:-/ 另外,你把这两个排除列表放在哪里?放在spec文件的excludes字段中吗?你需要先将它们连接在一起吗? - gaborous
目前很难获取规范文件,但如果我没记错的话,您可以使用pyi-archive-viewer的O命令,然后转储在此处查看方法中看到的数据:https://github.com/pyinstaller/pyinstaller/blob/develop/PyInstaller/utils/cliutils/archive_viewer.py。 - Bill Tutt
第一个排除项被传递到Analysis调用中。如评论中所述的第二个排除列表是从Analysis调用结果的纯属性中删除的模块名称。 - Bill Tutt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接