このページでは、外部パッケージ「PyInstaller」を使用して、モジュールを実行ファイル(Windowsだと.exeファイル)にしてみます。
実行ファイルにすれば、Pythonをインストールしていない人に対しても、ファイルを渡せば使ってもらうことができます。
とはいえ注意点が4つあって、先にお伝えしておくと、
- 作成されるファイルのサイズが大きくなりやすい
- クロスプラットフォームではない
- 起動するまでの時間が比較的長い
- ウイルス対策ソフトに誤検知される可能性がある
などがあります。
2番がどういうことかと言うと、Windowsで動作するファイル(.exe)を作成するには、Windows環境から、Macで動かしたいなら、Mac上でPyInstallerを使って実行ファイルを作る必要があります。
4番に関しては誤検知であって、PyInstallerで作られたマルウェアが多いからのようです。
PyInstallerが使いやすく、広く普及している弊害でしょう。
対策に関してはこのページでは行いません。次のリンク先が参考になるかもしれません。
Pyinstallerで実行ファイルがマルウェアに分類されてしまったときの対策 [はまたんく]
Building the Bootloader[pyinstaller.readthedocs.io]
使用した環境
Windows10
GitBash
Python 3.10.0
PyInstaller 4.9
準備
インストール
PyInstallerをインストールします。
※対応しているPythonのバージョンは3.6以降です。
pipから行います。
pip install pyinstaller
$ pip install pyinstaller
Collecting pyinstaller
Using cached pyinstaller-4.9-py3-none-win_amd64.whl (2.0 MB)
Collecting pywin32-ctypes>=0.2.0
Using cached pywin32_ctypes-0.2.0-py2.py3-none-any.whl (28 kB)
Collecting altgraph
Using cached altgraph-0.17.2-py2.py3-none-any.whl (21 kB)
Collecting pyinstaller-hooks-contrib>=2020.6
Using cached pyinstaller_hooks_contrib-2022.2-py2.py3-none-any.whl (223 kB)
Collecting pefile>=2017.8.1
Using cached pefile-2021.9.3.tar.gz (72 kB)
Preparing metadata (setup.py) ... done
Requirement already satisfied: setuptools in c:\users\fujino\documents\exe\lib\site-packages (from pyinstaller) (57.4.0)
Collecting future
Using cached future-0.18.2.tar.gz (829 kB)
Preparing metadata (setup.py) ... done
Using legacy 'setup.py install' for pefile, since package 'wheel' is not installed.
Using legacy 'setup.py install' for future, since package 'wheel' is not installed.
Installing collected packages: pywin32-ctypes, altgraph, pyinstaller-hooks-contrib, future, pefile, pyinstaller
Running setup.py install for future ... done
Running setup.py install for pefile ... done
Successfully installed altgraph-0.17.2 future-0.18.2 pefile-2021.9.3 pyinstaller-4.9 pyinstaller-hooks-contrib-2022.2 pywin32-ctypes-0.2.0
確認してみます。
$ pyinstaller --version 4.9
バージョン4.9がインストールされています。
モジュールの用意
実行ファイル化したいモジュールを用意します。
今回、私が用意したのはこちらです。
omikuji.py
import random from tkinter import messagebox fortunes = ('大吉', '吉', '凶', '大凶') messagebox.showinfo('おみくじ', random.choice(fortunes))
実行するとおみくじが引けます。
$ python omikuji.py

「大凶」が出て幸先が悪いですが、このモジュールを実行ファイル化してみたいと思います。
実行ファイル化
ターミナルから以下のコマンドでモジュールを実行ファイル化します。
pyinstaller モジュールのパス
$ pyinstaller omikuji.py
カレントディレクトリ内にモジュールがある状態で実行してみました。
終了すると、ディレクトリ内にいくつかのファイルやディレクトリが新しく作成されています。
$ ls __pycache__ build dist omikuji.py omikuji.spec
肝心の実行ファイルはどこにあるかと言うと、「dist/omikuji」の中にあります。
そこに「omikuji.exe」が作成されています。
$ ls dist/omikuji/
_asyncio.pyd _lzma.pyd _ssl.pyd libssl-1_1.dll tcl unicodedata.pyd
_bz2.pyd _multiprocessing.pyd _tkinter.pyd omikuji.exe tcl8 VCRUNTIME140.dll
_ctypes.pyd _overlapped.pyd base_library.zip pyexpat.pyd tcl86t.dll
_decimal.pyd _queue.pyd libcrypto-1_1.dll python310.dll tk
_hashlib.pyd _socket.pyd libffi-7.dll select.pyd tk86t.dll

実行ファイルを直接クリックしてみました。

おみくじは起動しましたが、合わせてコンソール画面も出てきています。
コンソール画面を表示させないようにするには、実行ファイル作成時にオプション「-w」か「--noconsole」を付けます。
$ pyinstaller -w omikuji.py

今度はコンソール画面が表示されませんでした。
これで完成です。
もし配布したいときには、実行ファイルの入っているディレクトリごと渡します。
今回の場合だと「omikuji」ディレクトリですね。
ちなみに「omikuji」ディレクトリのファイルサイズは20.7MBで、簡単なプログラムにしては結構あります。
ディレクトリのなかには実行ファイル以外にも色々入っていますが、それが嫌な場合、作成時に実行ファイルひとつにまとめることもできます。
オプション「-F」か「--onefile」を付けて作成すると可能です。
ただし、ひとつのファイルにまとめると、実行ファイルをクリックした時の起動が遅くなります。
$ pyinstaller -w -F omikuji.py
処理が終わると、「dist」ディレクトリのなかにあるのは、実行ファイルひとつだけです。
クリックしてみます……。

ひとつにまとめていないときの体感起動時間は、0.5秒未満でした。
ひとつにまとめたときの体感時間は、1秒かかりました。
今回は処理が軽いものでこの結果なので、重たいものであったらもっと時間がかかるかもしれません。
ひとつにまとめたファイルを配布するときは、実行ファイルを渡せばOKです。
ちなみにひとつにまとめた「omikuji.exe」は、9.37MBでした。
オプション等、その他の詳しい使い方は公式マニュアルを参照してください。
PyInstaller Manual [pyinstaller.readthedocs.io]
まとめ
PyInstallerのインストール
pip install pyinstaller
実行ファイルの作成
pyinstaller モジュールのパス
オプション
「-w」or「--noconsole」
コンソール画面の非表示
「-F」or「--onefile」
実行ファイルをひとつにまとめる
このページが少しでもお役に立てたのなら幸いです。