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))