Pythonで書いたコードを、スタンドアロンアプリを作成したい時、いつもcx_freezeを利用している。ところが、hellow worldぐらいのものでも、アプリ化後、80M程度の容量になってしまう。サイズ削減について、色々試してみた。

環境:
OS: macOS Big Sur 11.2.2
Python: 3.7
cx_freeze: 6.5
テストコード:https://github.com/marcelotduarte/cx_Freeze/tree/main/cx_Freeze/samples/wx

python3 setup.py bdist_mac
実行後、81.3M
要らないファイル削除後:34.4M(-47M程度サイズ削減できた)

*****.app/Contents/MacOS/lib/wx/直下、要らないファイル/フォルダー:
-----ファイル-----
・全ての.pyi
・全ての.dylib
・一部の.so(必須:_core.cpython-**m-darwin.so, siplib.cpython-**m-darwin.so)(必須は2つのみが、使っているwidgetによって指定する必要がある)
-----フォルダー-----
・locale
・svg
・py
・include

そのた:*****.app/Contents/MacOS/直下
・libcrypto.1.1.dylib
・libssl.1.1.dylib
・libncursesw.5.dylib
・libwx_osx_cocoau_html-3.1.5.0.0.dylib

setup.pyの処理の一番最後に、下記の関数を実行すれば、自動で削除してくれる。

import os
import shutil
def delete_unneeded_modules(app_path):
    # --------------wx library--------------
    needed_so_files = (
        "_core.cpython-37m-darwin.so",
        "siplib.cpython-37m-darwin.so"
    )
    # ファイル
    wx_lib_path = app_path + "/Contents/MacOS/lib/wx/"
    for f in os.listdir(wx_lib_path):
        if f.endswith((".pyi", ".dylib")):
            os.remove(wx_lib_path + f)
        elif f.endswith(".so") and (f not in needed_so_files):
            os.remove(wx_lib_path + f)
    # フォルダー
    for fld in ["locale", "svg", "py", "include"]:
        shutil.rmtree(wx_lib_path + fld)

    # --------------そのた:****.app/Contents/MacOS/直下--------------
    _dir = app_path + "/Contents/MacOS/"
    dylib_files = [
        "libcrypto.1.1.dylib",
        "libssl.1.1.dylib",
        "libncursesw.5.dylib",
        "libwx_osx_cocoau_html-3.1.5.0.0.dylib"
    ]
    for f in dylib_files:
        os.remove(os.path.join(_dir, f))