[Python]モジュールを実行ファイルにする

Python

このページでは、外部パッケージ「PyInstaller」を使用して、モジュールを実行ファイル(Windowsだと.exeファイル)にしてみます。

実行ファイルにすれば、Pythonをインストールしていない人に対しても、ファイルを渡せば使ってもらうことができます。

とはいえ注意点が4つあって、先にお伝えしておくと、

  1. 作成されるファイルのサイズが大きくなりやすい
  2. クロスプラットフォームではない
  3. 起動するまでの時間が比較的長い
  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

 Androidアプリを作成しました。
 感情用のメモ帳です。

スポンサーリンク
スポンサーリンク

準備

インストール

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
omikuji.exeアイコン

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

おみくじと共にコンソール画面が表示されている

おみくじは起動しましたが、合わせてコンソール画面も出てきています。

コンソール画面を表示させないようにするには、実行ファイル作成時にオプション-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
コンソール画面の非表示

-For--onefile
実行ファイルをひとつにまとめる

このページが少しでもお役に立てたのなら幸いです。

タイトルとURLをコピーしました