pythonのバイナリ化・exe化できない?仮想環境で軽量化

pythonスクリプトをwindowsプログラム化(exe化)できる?

pythonスクリプトをwindowsプログラム化

pythonwindowsexeとがpythonexe

pythonのexe化ライブラリ

pythonのexe化ライブラリ

pythonのexe化ライブラリとして、pyinstallerやcx_freezeなどがあります。pyinstallerを使ったexe化の例を見ていきましょう。

pyinstallerはpipコマンドでインストールできます。

$ pip install pyinstaller

exe化は、現在の実行環境から必要なものを取り込むため、そのままだと余分なモジュールを取り込んだり、環境依存がおこったりします。結果として、謎のクソデカexeが生成されたりするんですね。

謎のクソデカexeが生成される

そのため、まずはクリーンな仮想環境を作って、そこでexe化作業をおこないます。

仮想環境を構築すると、作成したexeファイルのサイズを最小限にできます。

仮想環境を構築するには、以下のコマンドを実行します。

```
python -m venv <仮想環境の名前>
```

仮想環境を構築したら、以下のコマンドを実行して仮想環境を有効にします。

source <仮想環境の名前>/bin/activate

exe化するスクリプトを用意します。hello.pyというファイル名で作成しました。

```
print("Hello World!")
```

下記のコマンドでpythonスクリプトをexe化することができます。

$ pyinstaller -F hello.py

hello.py
151 INFO: PyInstaller: 3.3.1
154 INFO: Python: 3.7.3

上記を実行すると、pyinstallerがhello.pyをexe化し実行ファイルを生成します。

pythonをexe化できない・動かない

Pythonでexe化できない・動かない

pythonをexe化できない・動かない場合、原因としては以下のようなものが考えられます。

・pythonのバージョンや開発環境が異なる
・ライブラリが足りない
・exe化するモジュールのバージョンの不一致

などです。

exeファイルを作成すると、Pythonのコアモジュールや外部モジュールが一緒にバイナリ化されてexeファイルになります。このため、外部モジュールを多くインストールしている状態でexeファイルを作成すると、必要ないライブラリまで取り込まれてexeファイルのサイズが大きくなります。

実行時に使わないモジュールを要求

それだけならまだしも、実行時に使わないモジュールを要求するようになるんですね。これはウザい。

それを防ぐために、仮想環境を構築して、仮想環境内でインストールしたモジュールのみを対象にexeファイルにバイナリ化するんですね。仮想環境に、不要なモジュールをインストールしないようにすることで、exeファイルのサイズを小さくできます。

exe化すると速度はどうなる?

exe化すると速度はどうなる?

exe化するとpythonスクリプトの実行速度が向上します。特に以下のような処理は高速化が見込めます。

exe化で高速化するが、CPU依存の処理はイマイチ

・大量のデータ処理
・複雑な数値計算
・画像処理
・機械学習モデルの推論
など。

クイックソートのような、forループしまくって多くの行を実行するようなタイプは高速化が見込めると考えてよいでしょう。

関連 Pythonのクイックソートのサンプルコード

関連 Pythonのfor文の解説 ループを使う方法

逆に、上記サンプルで使った「1行表示するだけのスクリプト」は、exe化してもしなくても一瞬で終了するためあまり意味がありません。

また、CPU密集型の処理(数値計算を行う処理など)では、pyinstallerを使っても、大幅な速度向上は見込めません。この場合、C言語などを用いて最適化を行うなどの対策が必要になります。また、並列処理を行う場合も、pyinstallerを使用しても期待できる効果は少ないでしょう。

pythonのexe化のまとめ

pythonのexe化のまとめ

  • Pythonスクリプトはpyinstallerでexe化ができる
  • exe化する場合は、仮想環境を作って作業するとexeモジュールサイズを小さくできる
  • 処理内容によって、exe化による速度向上の度合いは異なる。