Pyinstaller EXE軽量化(肥大化対策)

さまざまなことを実践したが、最も効果ありが仮想化環境を使うことだった。



 フォルダ内のPDFファイルを検索し、一つのPDFに結合するプログラムを作成した。配付するためpyinstallerでEXEを作成した。
20行程度のコードから245MBの巨大なEXEができた。起動も非常に遅い。
原因は、使わないライブラリが一緒にパッケージ化されることにあるようだ。
そこで、必要なライブラリに限定し仮想化環境で試したところ、うれしい効果があった。仮想無しと有りをポイントに備忘録としてまとめておきたい。

 蛇足ではあるが、Python codeのEXE化ツールは、pyinstallerのほかに、py2exe、py2app、cx_freeze、pyOxidzer、Nuitkaがある。
その中のNuitkaを試してみたが、時間がかかるほか、EXE自体がウィルスとして検疫されるといった事象に阻まれ、それ以上の追及をやめた。

仮想化を利用しないCompile

PDFファイルを結合するプログラムを作成。
プログラムと同一フォルダ内に結合対象のPDFを事前に用意することで、プログラムは自動結合する。そのファイル名は入力値で得る。

  • ① PythonCode(Source) → pdf_merge.py

pyinstallerの実行は、AnacondaPrompt環境で行う。

  • ② AnacondaPromptを開く
  • ③PythonCodeフォルダへ移動
       → C:\....\一時作業フォルダ\Python PDF
  • ④pyinstaller実行
       → pyinstaller pdf_merge.py --onefile --noconsole

pyinstallerの実行で、新たにbuildとdistのフォルダが作成される。また、ビルドに必要なspecファイルが作成される。exeはdistフォルダ内に作成される。

ステップ数にして20行に満たないPythonCodeがExeで245MBになる。
これは想定以上の容量である。また、起動に時間がかかり実用的ではない。

右図がPDF結合プログラムの実行画面になる。
起動まで十数秒かかる。

仮想化を利用したCompile

同様のPythonCodeを利用し、仮想化環境でpyinstallerを実行する。

仮想化を利用する場合、仮想化の環境を構築する手当が必要であり、その手順を含む操作を示す。

  • ①PythonCode(Source) → pdf_merge.py。

仮想化環境を構築し、pyinstallerを実行実行する。
操作は、AnacondaPrompt環境で行う。

  • ② AnacondaPromptを開く
  • ③PythonCodeフォルダへ移動
       → C:\....\一時作業フォルダ\Python PDF
  • ④この場所にPython仮想環境をつくる。
       → python -m venv .venv
        実行により、フォルダ .venv が作成され、そのフォルダ内に
        include、lib、script、pyvenv.cfg が作成される。

  •  ⑤仮想環境に切替
       → .venv\Scripts\activate
  •  仮想環境から出る場合は プロンプトの状態で deactivate を実行する。
     (仮想前のプロンプトに戻ります。)
  •  ⑥pip(インストールコマンド)を最新の状態にする。
       → python.exe -m pip install --upgrade pip
  •  ⑦必要なライブラリをインストール
      compilerの pyinstall と プログラムで使用するpypdf
       → pip install pyinstaller
       → pip install pypdf

       インストールの成否は Successfully installed ワードを確認する。

  •  ⑧EXE化の実行。
       → pyinstaller -F -w pdf_merge.py
  •  -Fでexeファイルを一つにまとめ、-wで起動時のコンソールを非表示にする。

  •  ⑨dist内EXEを確認
  •  サイズは9MB。
     仮想化未利用とでは236MBの圧縮、率として96%の結果を得た。
     また、起動もストレスを感じる時間ではない。

TOP