Pythonスクリプトをexe化すると、PythonがインストールされていないWindows端末でも実行することができます。今回はPythonスクリプトをexe化する方法について解説します。
Contents
exe化のメリットとデメリット
Pythonスクリプトは通常のWindowsのアプリケーションと異なりアイコンを設定したり関連付けのない状態でダブルクリックで起動したりすることはできません。また、前提としてそもそもPythonがインストールされている必要があります。
Pythonスクリプトをexe化すると、以下のような「それっぽい」プログラムが配布できるというメリットがあります。
- PythonをインストールしていないPCでも動かせるようになる
 - pythonコマンドではなくダブルクリックで起動することができるようになる
 - アイコンを設定することができる
 
副業でやるようなクラウドソーシングでの小規模な案件やちょっとした頼まれごとの場合、クライアントがPythonをインストールするのも一苦労、ということが多々あるのですが、こういった場合はexe化すると喜ばれます。
一方、特有の問題としてOSのバージョンやCPUアーキテクチャによって依存する可能性があり、動作保証の範囲を定めることが難しい場合があります。また、起動速度が場合によってかなり遅くなる、というデメリットがあります。
exe化とpyinstaller
exe化する方法ですが、pyinstaller若しくはpy2exeというライブラリを使用することが多いです。この記事を書いた2021年時点ではpyinstallerのほうが一般的なのでこちらの使い方を説明します。
以下はGoogle Trendの結果で青色がpyinstaller、赤色がpy2exeとなっています。pyinstallerのほうが人気であることがわかります。
pyinstallerのインストール
以下の通りpipコマンドでインストールすることが可能です。
pip install pyinstaller
pyinstallerの使い方
exe化自体は比較的簡単で、以下のコマンドを実行するだけです。詳細なオプションについては後ほど説明します。
pyinstaller <エントリーポイントとなるpythonスクリプト名> --onefile
例えば、sample.pyというPythonスクリプトをexe化する場合は以下のようにコマンドを実行します。
pyinstaller sample.py --onefile
スクリプトのexe化例
まずは練習がてら、単一のPythonスクリプトをexe化してみましょう。
# sample.py
print("exe化してみます。")
input()
先程紹介した以下のコマンドを実行してみてください。
pyinstaller sample.py --onefile
すると、以下のようなディレクトリ群とファイルが生成されます。
.\dist\sample.exe .\build .\sample.exe.spec
.specファイルはビルド方法について記述されたテキストファイルです。buildフォルダはビルドした中間ファイルが配置されます。そして、dist直下に生成されたexeファイルが実行可能なプログラムファイルとなります。実際、先程のコマンドで生成されたsample.exeをダブルクリックして実行してみるとコンソールが表示され、Pythonスクリプトを実行した時と同様の結果が得られます。
pyinstallerのオプション
次にpyinstaller のオプションについて説明します。代表的なものとして以下のオプションが挙げられます。
| オプション | 意味 | 
|---|---|
| onefile | ファイルを1つにまとめます。基本的には指定します。 | 
| noconsole | 実行時にコンソールの表示を抑制します。tkinter等を使用したGUIの場合は指定します。 | 
| debug all | デバッグ出力します。exe化に失敗したときなどの調査で使用します。 | 
| clean | キャッシュを削除します。納品時は指定するようにします。 | 
| icon | アイコンファイルのパスを指定します。 | 
| name | exeファイル名を指定します。 | 
以上を合わせ「それっぽい形」で納品したい場合は以下のようなコマンドを実行することになります。
pyinstaller main.py --name <出力exeファイル名> --onefile --icon <アイコンファイル> --noconsole
複数のスクリプトのexe化例
サードパーティ製ライブラリを使用したり複数モジュールがある場合も単一のライブラリの場合と全く手順は同じです。ただし、サードパーティ製ライブラリを使用する場合は必ずvenvなどの仮想化を使用するようにしましょう。
最後に練習としてrequests、tkinter、jsonを使用したexeの作成例を示します。起動すると以下のように自身のグローバルIPが表示されるプログラムです。
動作の補足ですが、以下のサイトにリクエストを送信し、JSONをパースし、自身のIPアドレスをtkinterで表示しています。
それでは始めてみましょう。まずvenvで仮想環境を構築し、requestsとpyinstallerをインストールします。
python -m venv venv venv\Scripts\activate pip install requests pip install pyinstaller
次に以下の通りスクリプトとアイコンファイルを準備します。
. ├ main.py ├─models │ ├ __init__.py │ └ myip.py └ myapp.ico
それぞれのスクリプト内容は以下の通りです。
 
エントリーポイントとtkinterによる描画
# main.py
from tkinter import Tk, Label
from models import myip
def main():
    window = Tk()
    window.title("My IP")
    my_ip = myip.get_my_ip()
    lbl = Label(window, text=my_ip)
    lbl.grid(column=0, row=0)
    window.mainloop()
if __name__ == "__main__":
    main()
ロジック部分
# models\myip.py
import json
import requests
def get_my_ip():
	r = requests.get("[http://httpbin.org/ip](http://httpbin.org/ip)")
	my_ip = json.loads(r.text).get("origin")
	return my_ip
準備が整ったらexe化してみましょう。以下のコマンドを実行します。
pyinstaller main.py --name myip.exe --onefile --icon myapp.ico --noconsole
dist配下に以下の様なexeファイルが作成されます。
作成されたexeファイルとダブルクリックすると通常のWindowsのアプリケーションと同じように起動できることが確認できます。作ったプログラムを配布する際は是非使用を検討してみてください。
