Pythonで作成したプログラムを別のPCで実行する場合は、まずPythonの環境を整えて必要なパッケージをインストールするところから始める必要があります。しかし、オープンソース・プロジェクトのパッケージでは頻繁にバージョンアップがなされていて、バージョンまでそろえないと正しく動作しないという場合も珍しくありません。自分だけで使うのならそれで十分でも外部に配布する場合はそれでは困ってしまいますよね。そもそもコンピューターに詳しくない人にPythonの実行環境を整えさせるのは現実的ではありません。
そのようなときは、Pythonプログラムをexe形式の実行ファイルに変換して、ダブルクリックするだけで実行できるようにしましょう。ここでは、Pythonのプログラムを簡単にexeファイルに変換する方法を説明します。
[toc]Pythonスクリプトをexeファイルに変換する方法
Pythonスクリプトをexeファイル化する方法としては以下のツールがよく用いられています。
両者のメリット・デメリットの比較は次のようになります。
PyInstaller | py2exe | |
---|---|---|
導入のしやすさ | 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ファイル化する手順は次の通りです。
- コンソール上でPythonスクリプト(.pyファイル)のあるディレクトリに移動する
- 次のコマンドを実行する:
pyinstaller 〇〇.py
(〇〇.pyはPythonスクリプトのファイル名)
ここでPyInstallerのよく用いられるオプションとしては次のようなものがあります。
–noconsole | 出力したexeファイルを実行した際にコンソール画面を表示させない |
–onefile | 1つの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秒にまで高速化できました。
コメント