【Python】pyinstallerでpyファイルを配布用にEXE化する方法
2020.04.28 /

Pythonで記述したプログラムを配布したい場合、そのpyファイルをexe化して配布する方法があります。
exe化することにより、配布先のPCにPythonがインストールされていなくてもexe化されたプログラムを起動することができます。
Pythonでexe化するライブラリはいくつかありますが、今回は一番簡単な「Pyinstaller」を使った方法を解説していきます。
exe化とは
exe化とは、Windows環境における実行形式のファイルにすることです。
実行形式のファイルとは、それ単体で実行できるファイルということです。簡単にいうとダブルクリックすれば起動するファイルです。
exe化することで、プログラムの起動が簡単になり、またPythonがインストールされていなくてもプログラムを起動できるという大きなメリットがあります。
Pyinstallerとは
PyinstallerとはPythonスクリプトをexe化するためのライブラリです。
他のexe化するライブラリと比べて非常に簡単にexe化できるという特徴があります。
ネットで調べるとPyinstallerを使ったexe化の方法がたくさんあるので、多くの方がPyinstallerを使っていることがわかります。
Pyinstallerは簡単にexe化できる反面、作成したexeファイルの起動が遅いというデメリットがあります。
より起動が高速なexeを作成したい場合は、py2exeやembeddable pythonを使うことをお勧めします。
またexe化のもう1つのデメリットとしては、exeファイルのサイズが非常に大きくなってしまうことがあることです。
ファイルサイズ肥大化を避けるための方法は後述します。
Pyinstallerを使ったexe化の方法
Pyinstallerを使うためには、まずインストールする必要があります。
下記のようにpipコマンドでpyinstallerをインストールします。
pip install pyinstaller
これでpyinstallerを使ってexe化する準備が整いました。
Pythonファイルをexe化するには、まず目的のPythonファイルが存在するディレクトリに移動します。その後、以下のコマンドを実行します。
pyinstaller ファイル名 -–onefile -–noconsole
上記コマンドではオプションとして、--onefileと—noconsoleを指定しています。
--onefileは生成されるものを1つのファイルにまとめ、--noconsoleはexeファイル実行時にコンソールが表示されないようにします。
pyinstaller実行時、onefileとnoconsoleは基本的につけましょう
このコマンドを実行するとPythonファイルが入っているディレクトリに「__pycache__」、「build」、「dist」のフォルダが新たに作成されます。
目的のexeファイルはdistフォルダ内に入っています。
このexeファイルを配布すれば、あなたが作ったプログラムを受け取った相手はクリックするだけで起動できるようになるというわけです。
exeファイル起動時の注意点
exe化したプログラムに関連するファイルがある場合、それらのファイルと階層をそろえる必要があります。
私の場合は、GUI画面のボタンに画像を使っているプログラムが多いので、それらファイルと同じ階層にexeファイルを持っていきます。
アイコンを設定する
pyinstallerではアイコンを設定するためのオプションもあります。
pyinstallerでビルドするときに--iconのオプションを使用します。その際にアイコンで使用する画像icoファイルを指定します。
pyinstaller ファイル名 -–onefile -–noconsole --icon=test.ico
アイコン画像のicoファイルの作成には以下サイトを使うと簡単にicoファイルを作成できます。
アイコンが反映しない場合の対処方法
上記の方法でexeファイルのアイコンは作成されるのですが、Windowsを使っている人の中にはアイコンが反映しない!!という方もいます。
その原因はアイコンキャッシュです。
Windowsを再起動またはアイコンキャッシュを削除することで、希望のアイコンに戻るはずです。
再起動させないでアイコンキャッシュを削除する方法としては、ie4uinit.exeを使います。
エクスプローラーをすべて閉じた後に、「ファイル名を指定して実行」に「ie4uinit.exe -show」を入力して実行するだけです。

もしアイコンがうまく表示されなくても焦らずに、上記方法を試してみてください。
exeファイルの肥大化を抑える(軽量化)
pipで多くのモジュール(パッケージ)をインストールしているpythonからpyinstallerでexeファイルを使用すると、ファイルサイズが大きいexeファイルが作成されます。
それはpipでインストールしているモジュールすべてを組み込んでしまうからです。
それを防ぐために仮想化を使用します。仮想環境を構築して、そこには該当プログラムで使用するモジュールのみをインストールします。
そうすることで最小限のモジュールを組み込んだexeファイルが作成されるのです。
仮想環境の作成方法に関しては、以下記事をご参照ください。

【Python】仮想環境の構築と有効化の方法
インストールしているライブラリが少なければ、--excludeで不必要なライブラリをexeファイルから省くことができます。
pyinstaller ファイル名 --onefile --exclude numpy
numpyやpandasなどはかなり容量があるので、exe化するプログラムに不必要であればexcludeしてexeファイルの軽量化を図ったほうがいいですね。
指定できるオプション一覧
すでにいくつかのオプションについては説明していますが、その他にも様々なオプションがpyinstallerには存在します。
すべてのオプションについては以下サイト(英語)に記載されています。
onefile:出力ファイルを1つにまとめる
--onefile または -F
上記オプションのonefileは出力されるファイルを1つにまとめるためのオプションです。
私はexeファイルを作成するときは、必ずこのオプションを付けます。
noconsole:コンソール表示をなくす
--noconsole または -w , --windowed
上記オプションnoconsoleは作成したexeファイルを起動した際にコンソールを表示しなくします。
基本的にはこのオプションを付けるのですが、このオプションを追加したことで何かしらのバグが発生し起動しなくなったことがあります。
そのためその時は仕方なく、--noconsoleは付けないでexeファイルを作成しました。
その時のアプリは、PDFを画像に変換するためにpdf2imageモジュールの convert_from_pathを使っていて、これが悪さしてコンソール必須になっていました。未だにこの問題は解決できず。
clean:キャッシュ、ディレクトリの削除
--clean
上記オプションcleanはPyinstallerキャッシュや前回作成されていたディレクトを削除してくれます。
icon:アイコンの設定
--icon または -i
上記オプションは、作成したアプリにアイコンを設定することができます。
onedir:ディレクトリをまとめる
--onedir または-D
上記オプションは作成されるディレクトリを1つにまとめてくれます。
name:ファイル名の指定
--name または -n
上記オプションnameは、exeファイルのファイル名を指定することができます。--nameの後に希望するファイル名を入力して使います。
help:ヘルプメッセージの表示
--help または -h
上記オプションhelpは、ヘルプメッセージを表示します。
version:プログラムバージョンの表示
--version または -v
プログラムバージョンを表示します。
exeファイルが実行できない問題
様々なスクリプトをexe化しているとexeファイルが正常に実行されない問題に直面します。
これはpyinstallerと互換性がないライブラリをexeファイルに組み込もうとしている場合に発生します。
--onefileで作成したexeファイルは動作しないけど、オプションなし作成したexeファイルでは問題なく動作するときもあります。
また例えば最新のpywin32では動作せず、過去のバージョンでは動作するといったこともあります。詳しくは以下記事をご参照ください。

【Python】pyinstaller:pywin32(win32com)を含んだexeが動作しない問題の解決
今後pyinstallerを利用していこうと思っている方は、exeファイルが実行されない問題に直面しても焦らずに、どのライブラリが問題を発生させているのかを慎重に見極めてください。
Pyinstallerにお勧めのライブラリ
tkinter
tkinterはGUIアプリケーションを作成する際に使用する標準ライブラリです。
作成したGUIアプリケーションは基本的に作成した本人よりも、配布して他の人に利用してもらうことを目的としているはずです。
Pyinstallerでexe化して配布することで、作成したGUIアプリケーションを誰でも利用できるようになります。

【Python】tkinterを使ったGUIアプリケーションの作成方法
Pystray
Pystrayはタスクトレイにアプリケーションを常駐させるライブラリです。
バックグラウンドでアプリケーションを起動させておいて、定期的に処理を実行させたいときなどにも利用できます。
スタートアップにexe化したアプリを追加して、起動したアプリはタスクトレイに常駐させておく、といった使い方ができます。

【Python】タスクトレイにアプリを常駐させる:pystrayで定期的に実行
Selenium
Seleniumはブラウザを操作・制御するライブラリです。スクレイピングによるデータ収集やRPAに利用されることが多いです。
私はSeleniumを利用して業務効率化のRPAをいくつも開発しています。開発したアプリはPyinstallerでexe化して社員に配って利用してもらっています。

【Python】Selenium:ブラウザ操作して静的・動的(Ajax、javascript)ページから情報を取得
まとめ
自分で作ったプログラムを配布できるようになると、より一層プログラミングが楽しくなって、やりがいも増えていきます。
ぜひ今回覚えたexe化の方法を使って、友達や会社の人にexe化したPythonプログラムを配布して使用してもらってください。
exe化したアプリとその他画像やファイルを一度で所定の場所に保存できるようにしたい、デスクトップにショートカットを自動的に作成したい、 コントロールパネルの「プログラムと機能」にアプリを登録したい、ということであればインストーラーを作成するのがお勧めです。
下記リンクのWindows用インストーラーを作成するNSISのインストール方法をご覧ください。

【NSIS】Windows向けインストーラー作成アプリのインストール方法