Pythonスクリプトをexe化する

Pythonスクリプトをexe化すると、PythonがインストールされていないWindows端末でも実行することができます。今回はPythonスクリプトをexe化する方法について解説します。

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で表示しています。

http://httpbin.org/ip

それでは始めてみましょう。まず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のアプリケーションと同じように起動できることが確認できます。作ったプログラムを配布する際は是非使用を検討してみてください。