Pythonスクリプトを実行形式(exeファイル)に変換する【Python】

Pythonで作成したプログラムを別のPCで実行する場合は、まずPythonの環境を整えて必要なパッケージをインストールするところから始める必要があります。しかし、オープンソース・プロジェクトのパッケージでは頻繁にバージョンアップがなされていて、バージョンまでそろえないと正しく動作しないという場合も珍しくありません。自分だけで使うのならそれで十分でも外部に配布する場合はそれでは困ってしまいますよね。そもそもコンピューターに詳しくない人にPythonの実行環境を整えさせるのは現実的ではありません。

そのようなときは、Pythonプログラムをexe形式の実行ファイルに変換して、ダブルクリックするだけで実行できるようにしましょう。ここでは、Pythonのプログラムを簡単にexeファイルに変換する方法を説明します。

Pythonスクリプトをexeファイルに変換する方法

Pythonスクリプトをexeファイル化する方法としては以下のツールがよく用いられています。

両者のメリット・デメリットの比較は次のようになります。

PyInstallerpy2exe
導入のしやすさAnacondaから簡単にインストールできる
Anacondaには最新版が登録されていない
(PyPIには登録されている模様)
exeファイル作成手順コマンド1つでPythonスクリプトをexeファイルに変換できる予めセットアップスクリプトを作成したうえで、変換を実行する必要がある
exeファイルのサイズ大きい小さい
exeファイルの起動時間遅い早い

以上のようにpy2exeの方が完成したexeファイルのサイズは小さく、起動速度も速いという特徴はあるのですが、py2exe自体の導入もAnacondaでは管理できず、また変換処理もコマンド一つで実行できるPyInstallerと比べると煩雑であるという一長一短があります。

導入や操作のしやすさではPyInstallerの方が優れているので、ここではPyInstallerを用いたPythonスクリプトの実行形式(exeファイル)への変換を説明します。

condaを用いたPyInstallerのインストールと基本的な使い方

PyInstallerのインストール

PyInstallerはAnacondaのconda-forgeチャネルに最新版が登録されています。

以下のコマンドからインストールしましょう。

conda install -c conda-forge pyinstaller

PyInstallerの基本的な使い方

PyInstallerでPythonスクリプトをexeファイル化する手順は次の通りです。

  1. コンソール上でPythonスクリプト(.pyファイル)のあるディレクトリに移動する
  2. 次のコマンドを実行する:pyinstaller 〇〇.py (〇〇.pyはPythonスクリプトのファイル名)

ここでPyInstallerのよく用いられるオプションとしては次のようなものがあります。

–noconsole出力したexeファイルを実行した際にコンソール画面を表示させない
–onefile1つのexeファイルにまとめて出力する
※ 詳細は公式ドキュメントをご覧ください。

–onefileオプションをつければ、1つのexeファイルとして出力してくれて配布しやすくなるので、つけておいた方がよいと思われます。これにより「dist」フォルダにexeファイルが作成されます。また、GUIアプリやバックグラウンドで行われる処理の場合はコンソール画面は不要なので、そのようなプログラムでは–noconsoleオプションをつけておきましょう。

なお、PyInstallerを実行するとPythonスクリプト(〇〇.py)と同じフォルダに「〇〇.spec」という設定ファイルが自動生成されます。もしその設定ファイルに何か変更を加えて、それをもとにexeファイルを作りたいときは、次のようなコマンドを実行します。

pyinstaller 〇〇.spec --onefile

PyInstallerを用いたPythonスクリプトのexeファイル化

基本的なPythonスクリプトをexe化する

以下の「Hello, world!」を表示するだけのサンプルプログラム(PythonApp1.py)をexeファイルに変換してみましょう。

PythonApp1.py
print('Hello, world!')
input()

これをPyInstallerを用いて以下のようにexeファイル化します。

cd 〇〇〇
pyinstaller PythonApp1.py --onefile

まずcdコマンドでPythonスクリプト(PythonApp1.py)のあるディレクトリに移動してから、pyinstallerコマンドを実行しましょう。ここで「dist」フォルダに作成されたPythonApp1.exeファイルをダブルクリックすれば実行することができます。もちろんコマンド上からもexeファイルは実行可能です。

なお、ここで作成されたexeファイルは約7MBのサイズになりました。

引数のあるPythonスクリプトをexe化する

引数のある実行形式のプログラムはどのようにして作ればいいのでしょうか?例えば、先ほど使った「pyinstaller」コマンドは「PythonApp1.py」「–onefile」という2つのオプションを指定することでそのコマンドの実際の動作を指定しています。このオプションのことをその処理の引数といいますが、このように引数を持つPythonスクリプトをexeファイルとして作ることはできるのでしょうか?

実は引数のリストはsysモジュールのargvとして取得することができるのです。あとは先ほどと同様にしてexeファイル化するだけでOKです。それでは次のように、Pythonスクリプトの引数をそのまま表示するだけのプログラム(PythonApp2.py)を考えてみましょう。

PythonApp2.py
import sys
args = sys.argv
print(args)
input()

次にこれをPyInstallerを用いてexeファイル化します。

cd 〇〇〇
pyinstaller PythonApp2.py --onefile

これにより引数に指定した文字列をそのままリストとしてスクリプト内で扱うことができています。なお、引数リストの1つ目は必ずそのコマンド名になります。

PandasやOpenCVを用いたPythonスクリプトをexe化する

続いてより実用的な例としてPandasやOpenCVを用いたPythonスクリプトをexeファイル化することを考えてみます。なお、ここではPandasやOpenCVはAnacondaで導入したものとして考えてみます。

Pandasを用いたPythonスクリプト

まずは以下のように単純なDataFrameを定義して表示するだけのプログラムを考えてみます。

PythonApp3.py
import pandas as pd
df = pd.DataFrame([['1-1', '1-2', '1-3'], 
                    ['2-1', '2-2', '2-3'], 
                    ['3-1', '3-2', '3-3']])
print(df)
input()

ではこのスクリプトをPyInstallerでexeファイル化してみましょう。

cd 〇〇〇
pyinstaller PythonApp3.py --onefile

これで作成されたPythonApp3.exeで実行可能なのですが、ファイルサイズが308MBと非常に巨大となってしまっており、またexeファイルの起動にも時間がかかり処理が終わるまで平均で21秒かかりました。

ただ単に、DataFrameを1つ定義するだけの処理なのになぜこれだけのファイルサイズになってしまうのでしょうか?それはAnacondaでPandasと一緒に依存ライブラリとしてインストールされたものが、すべてPyInstallerによって含まれてしまっているからです。

OpenCVを用いたPythonスクリプト

次にOpenCVでPCのローカル上に保存されている「Lena.jpg」を読み込み、それを別フォルダに「Lena2.tif」として保存するプログラムを考えてみましょう。

PythonApp4.py
import cv2
img = cv2.imread(r'C:\BioTech-Lab\Lena.jpg')
cv2.imwrite('Lena2.tif', img)

ではこのスクリプトをPyInstallerでexeファイル化してみます。

cd 〇〇〇
pyinstaller PythonApp4.py --onefile

これでPythonApp4.exeを作成することができましたが、こちらも295MBと非常に巨大なファイルとなってしまい、処理にも平均13秒かかってしまっています。ただ単に、画像ファイルを読み込んで保存するだけのプログラムなのになぜこんなに巨大なファイルサイズで重くなってしまったのでしょうか?

こちらも同様にAnacondaによって依存ライブラリとしてOpenCVと共にインストールされたものが、実際に使われているかどうかにかかわらずPyInstallerによってすべて含まれてしまっているのでこれだけ巨大なファイルになってしまったのです。

肥大化したexeファイルの圧縮方法

先ほどお示しした通り、PandasやOpenCVを用いたPythonスクリプトをPyInstallerを用いてexeファイルに変換すると、実際に使っているかどうかにかかわらず関連する依存ライブラリがすべて含まれてしまって、ファイルサイズが巨大になってしまいパフォーマンス低下の原因にもなります。特にAnacondaでインストールすると関連する依存ライブラリがすべてインストールされてしまうので、pipコマンドからインストールした方がPyInstallerとの相性はよいようです。

ただし、Anacondaによるインストールとpipによるインストールを共存させるのは一般的に推奨されていないので、ここではexeファイル作成用の一時的な仮想環境にのみpipでインストールすることとしています。なお、Anacondaの操作方法は以下のページもご覧ください。

Pandasをpipでインストールしてexeファイル化する

以下のようにしてexeファイル作成用の仮想環境をAnacondaで作成して、先ほどのPythonApp3.pyをexeファイルに変換しましょう。

conda create -n env3
activate env3
conda install python
conda install -c conda-forge pyinstaller
pip install pandas

cd 〇〇〇
pyinstaller PythonApp3.py --onefile

先ほどのPythonApp3を上記の通り最小限の環境でexe化すると308MBから31.1MBまで軽量化することができました。さらに、exeファイルの起動時間も4.9秒まで短縮されました。

ただし、最低限のモジュールしかインストールされていないので、インストールされたモジュールが足りなくてエラーになることもあります。その際は追加でpipでインストールしておきましょう。

OpenCVをpipでインストールしてexeファイル化する

続いて以下のようにしてexeファイル作成用の仮想環境を改めてAnacondaで作成して、先ほどのPythonApp4.pyをexeファイルに変換しましょう。

conda create -n env4
activate env4
conda install python
conda install -c conda-forge pyinstaller
pip install opencv-python

cd 〇〇〇
pyinstaller PythonApp4.py --onefile

今度はPythonApp4.exeは295MBから54.7MBまで軽量化されました。画像を読み込んで書き込むだけの処理で50MBを超えてしまっているので、まだファイルサイズは大きいのですが、それでももとのexeファイルと比較するとかなり軽量化できたことが分かります。処理時間も13秒から平均2.7秒にまで高速化できました。

関連記事・スポンサーリンク

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)