【问题标题】:PyInstaller very big file sizePyInstaller 文件很大
【发布时间】:2013-10-15 11:44:50
【问题描述】:

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

使用 Linux、Fedora 18 64 位。

【问题讨论】:

    标签: python file wxpython size pyinstaller


    【解决方案1】:

    wxPython 是一个大型库,因此当您创建可执行文件时,它们的大小往往在 20 到 30 MB 之间。另请注意,Python 本身有点笨重,因为 Python 是一种解释型语言。因此,当您创建 exe 时,您还包括 Python 解释器。

    使用 py2exe,我得到了低于 10 MB 的可执行文件,但这很痛苦,并且不适用于所有项目。这真的取决于你还在使用什么。你可以通过 py2exe here 阅读我的冒险经历。

    另一种缩小尺寸的方法是使用压缩程序。这有时有效,有时无效。

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

    【讨论】:

    • 感谢您的回答。我会尝试使用 UPX,或者我会尝试用 C++ 重写我的程序,然后使用 gcc 编译它
    • 听起来像是一个计划。祝你好运!
    【解决方案2】:

    我发布了一个相当简单的 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 文件目前不容易访问,但如果我没记错的话,您使用 O 命令用于 pyi-archive-viewer,然后转储您在显示方法在:github.com/pyinstaller/pyinstaller/blob/develop/PyInstaller/….
    • 上面的第一个排除被传递到分析调用中。注释中提到的第二个排除列表是从分析调用结果的纯属性中删除的模块名称。
    猜你喜欢
    • 1970-01-01
    • 2020-11-18
    • 1970-01-01
    • 2017-10-17
    • 2017-11-18
    • 2021-12-20
    • 2014-02-05
    • 1970-01-01
    • 2019-09-25
    相关资源
    最近更新 更多