業務で必要になり調べたり試したりしてみたので、記録がてら初投稿。
py2exeとpyinstallerを使用し、最終的にpyinstallerを使用しています。
記述は全てpipenvでの仮想環境下を想定しています。1
適宜読み替えてください。
誤っている箇所などあれば気軽にコメント等お願いします。
環境
- Windows 10 version 2004 (May 2020 Update)
- pipenv 2020.8.13
- python 3.8.5
- numpy 1.19.2
- pandas 1.1.2
- py2exe 0.9.3.2 or pyinstaller 4.0
- pipenv 2020.8.13
py2exe
色々調べたところ、pyinstallerより軽量かつ高速!とあったので使用してみるも、pandasやscipyなどのモジュールがあると何故か依存ファイルに漏れが出て、実行時にimportエラーが出る。
(numpyは問題なかった。またGithub等で色々調べるとmatplotlibやQtPyなども問題になり得るみたい。)
使用していたpy2exeのバージョン(0.9.3.2)がリリースされた時点に合わせてライブラリをダウングレードしてみたりするも改善せず。
筆者はここでpy2exeを一旦見限った。
簡単なファイルで実行まで試したので、使い方だけサラッと説明します。
インストール
使用する環境、バージョンに合わせて.whlファイルをGithubからダウンロードしてくる。
その後、
$ pipenv install py2exe-0.9.3.2-cp37-none-win_amd64.whl
# 非仮想環境下
$ pip install py2exe-0.9.3.2-cp37-none-win_amd64.whl
とするとインストールできる。
(pip install py2exe
でもインストールできるが、古いバージョンになる。)
実行方法
- setup.pyを、exe化したいファイルと同じ階層に作成(各種optionはここで指定。詳しくはGoogle先生迄)。
from distutils.core import setup
import setuptools
import py2exe
setup(
console = [{'script': 'xxx.py'}] # exe化するファイル
)
- exe化
$ pipenv run python setup.py py2exe
これでdistディレクトリ下にhello.exeができる。
pyinstaller
pandasやnumpy等のライブラリを使っている場合、py2exeに比べて遅い・容量が大きいの二重苦で使用を避けていたが、py2exeが上で記したような感じだったのでこちらを使用することに。
参考:
インストール
$ pipenv install pyinstaller
# 非仮想環境下
$ pip install pyinstaller
実行方法
- ファイルをまとめずexe化する場合
$ pipenv run pyinstaller xxx.py
結果
.
├─build
│ └─xxx
└─dist
└─xxx
├─xxx.exe # 生成された実行ファイル
├─Include
├─numpy
├─pandas
実行にはxxx以下が全て必要。
- ファイルをまとめてexe化する場合
$ pipenv run pyinstaller xxx.py --onefile
結果
.
├─build
│ └─xxx
└─dist
└─xxx.exe # 生成された実行ファイル
スッキリ。
pyinstallerで生成された.exeファイルの容量・実行時間について
簡単な.pyファイルを作って実験。環境は上と同じ。
-
実験パターン
- 'normal': ファイルをまとめずにexe化
- 'onefile': ファイルをまとめてexe化
-
使用ファイル
import sys
import numpy
import pandas
with open('test.txt', 'w') as f:
f.write(f'argv: {sys.argv}') # 引数がちゃんと渡せるか確認
- 実行
$ pipenv run pyinstaller hello.py # --onefile
$ dist/hello.exe hello world 1 2 3
- 出力ファイル
argv: ['C:{PATH}\\hello.exe', 'hello', 'world', '1', '2', '3']
引数の渡し方は.pyの実行と同様で良さそう。
- 結果
ファイル容量(distディレクトリ) | 実行時間 | |
---|---|---|
normal | 148MB | <1s |
onefile | 55MB | 10~20s |
容量と実行時間がトレードオフっぽい。55MBでも十分大きいけど。
まとめ
python以外の言語で書かれた既存のソフトに学習済みの機械学習モデルを組み込んだりするときに使えるかもしれないが、容量の大きさと、今回使用していない他ライブラリとの依存関係などが気になるところ。
気が向いたらもう少し実験して追記します。
-
exe化実行時に環境にあるライブラリは全てexeに含まれてしまい容量がバカみたいに大きくなるという記述があったので、pipenvを使用して最小限のライブラリをインストールし、実行している。 ↩