logo
Published on

【Python】pyinstallerの軽量化【exe大きすぎ問題】

Authors

こんにちは、snuow です。社給品の PC の場合、好き勝手にソフトウェアをインストールできないことがあると思います。そんな時環境構築できない WindowsPC において、python で作成したプログラムを動かす場合、pyinstaller を使うことがあると思います。

ただ、pandas などの重量級ライブラリを使用すると、--onefileで exe にまとめたときに、200MB を超える巨大なファイルになってしまいます。この exe 大きすぎ問題を解決したいと思います。

240MB は重すぎでしょ・・・

pandas 導入時の exe 重すぎる問題・・・

私が、当時作ったツールで使用したライブラリは下記のようになっていました。pandas から特定の機能だけ抜き出したら軽くなるのでは?と思ったがそんなことはなかったぜ・・・

import glob
import os
import re
import sys
from datetime import datetime, timedelta
from pandas import read_csv, DataFrame, concat

解決策:MKL が重い原因だった。

  • MKL***というのが悪さをしているらしい。
  • .spec ファイルに下記の項目を追加する。
  • .spec ファイルは、pyinstaller を動かしたときに中間ファイルとして作成されます。
\# -\*- mode: python -\*-

block\_cipher = None

import sys
sys.setrecursionlimit(50000)

a = Analysis(\['C:\\\\Users\\\\\*\*\*\\\\PycharmProjects\\\\tool\_for\_armadillo\\\\main.py'\],
             pathex=\['C:\\\\Users\\\\\*\*\*'\],
             binaries=\[\],
             datas=\[\],
             hiddenimports=\[\],
             hookspath=\[\],
             runtime\_hooks=\[\],
             excludes=\[\],
             win\_no\_prefer\_redirects=False,
             win\_private\_assemblies=False,
             cipher=block\_cipher,
             noarchive=False)
pyz = PYZ(a.pure, a.zipped\_data,
             cipher=block\_cipher)

#---------------追加ここから---------------
Key = \['mkl'\]

def remove\_from\_list(input, keys):
    outlist = \[\]
    for item in input:
        name, \_, \_ = item
        flag = 0
        for key\_word in keys:
            if name.find(key\_word) > -1:
                flag = 1
        if flag != 1:
            outlist.append(item)
    return outlist

a.binaries = remove\_from\_list(a.binaries, Key)

#---------------追加ここまで---------------

exe = EXE(pyz,
          a.scripts,
          a.binaries,
          a.zipfiles,
          a.datas,
          \[\],
          name='main',
          debug=False,
          bootloader\_ignore\_signals=False,
          strip=False,
          upx=True,
          runtime\_tmpdir=None,
          console=True )


結果:1/5 くらいには減らせました。

55MB 程度に落ち着きました。

1/5 程度に減らすことができました。

環境構築できない PC 向けに作成しましたが、これでもまだ大きい気がしますね。動作的には問題ないのですが・・・

もし、より減らせる方法があれば教えてください。