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