この記事では、Pythonファイルを実行ファイルに変換する方法を解説します。
実行ファイル化(exe化)することでPythonがインストールされていない環境でもPythonプログラムを実行することができるようになります。
それにより作成したプログラムを配布したりすることができます。
それでは、Pythonファイルをexe化する方法を見ていきましょう!
実行ファイルとは?
実行ファイルとは、exeファイル(エグゼファイル)やexecファイルなどの総称でダブルクリックするだけで処理を実行できるファイルのことを言います。
実行ファイルは、必要な環境(ここではPyhton)がインストールされていない場合でも処理を実行することができます。
それにより、幅広く配布が可能となります。
Linkexeファイル (エグゼファイル)とは|「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典
実行ファイル化(exe化)
それでは、Pythonファイルをexe化する方法を見ていきましょう!
ここでは、人気の高いpyinstallerを使用します。
pyinstallerのインストール
pipコマンドを使ってインストールします。→ pipのインストール
pip install pyinstaller
pyinstallerの使い方
pyinstallerコマンドを使って以下のようにexe化します。
pyinstaller スクリプト名
PyInstaller Manual — PyInstaller 4.8 documentation
exe化してみる
試しに適当なPythonファイルを実行ファイル化してみましょう!
今回は、以下のtest.pyを使います。
test.py
print('Hello world')
そしたら、ターミナルなどのコマンドラインから以下のコマンドを実行します。
pyinstaller test.py
実行するといろいろ表示され、
$ pyinstaller test.py 239 INFO: PyInstaller: 4.5.1 239 INFO: Python: 3.9.0 268 INFO: Platform: macOS-10.15.7-x86_64-i386-64bit 277 INFO: wrote /Users/user/Desktop/Python/test.spec 411 INFO: UPX is not available. 413 INFO: Extending PYTHONPATH with paths ['/Users/user/Desktop/Python', '/Users/user/Desktop/Python'] 713 INFO: checking Analysis 714 INFO: Building Analysis because Analysis-00.toc is non existent ・ ・ ・ 略
test.pyと同じディレクトリに複数のディレクトリやファイルが作成されます。
実行ファイルは、distディレクトリに格納されています。
見つけたらダブルクリックで実行してみましょう!
すると、以下のようにHello worldが出力されました。
外部ファイルを使いたい
exeファイルから外部のファイルを使えるようにするには、使用するファイルをspecファイルに追記する必要があります。
例えば、先ほど実行ファイル化したtest.pyが、以下のようにテキストファイルを使用するコードだったとします。
test.py
with open('text.txt', 'r') as f: print(f.read())
テキストファイルの内容はなんでも良い。
text.txt
Hello World
このままtest.pyをexe化して実行しても以下のようにエラーが発生する。
上記ではファイルが見つからないってエラーが出ていますね。それではexe化した際に生成されたspecファイルに使用するファイルを追加してみましょう。
specファイルのAnalysisのdatasに以下のような形式で追加します。
('追加するファイルやディレクトリのパス', '追加する場所(ディレクトリ)')
同ディレクトリ内にあるtext.txtをアプリのトップレベルのディレクトリに追加するには以下のように記述します。
specファイルを変更したら次にtest.pyも書き換える必要があります。
追加されたファイルは_MEIPATHという場所に格納されるので以下のような関数を通してファイルを検索します。
import sys import os def resource_path(filename): if hasattr(sys, '_MEIPASS'): return os.path.join(sys._MEIPASS, filename) return os.path.join(os.path.abspath("."), filename) with open(resource_path('text.txt'), 'r') as f: print(f.read())
specファイルとtest.pyを書き換えたら変更をビルドします。
コマンドラインで以下のコマンドを実行してください。specファイルを使用している点に注意。
pyinstaller test.spec
生成されたexeファイルを実行してみてください。
外部ファイルを使用することができました。
オプション
PyInstallerには様々オプションが用意されています。ここでは中でもよく使われるオプションを見ていきましょう!
1つのファイルにまとめる
--onefileオプションを付けることで1つのファイルにまとめることができます。
pyinstaller test.py --onefile
以下のように1つのファイルにまとめられてスッキリします。
外部ファイルを使用している場合でも1つのファイルにまとめることでexeファイルだけで実行可能となる。
コンソールを表示しない
--noconsoleオプションを付けることで実行ファイルを処理しているときにコンソールを表示できなくします。
pyinstaller test.py --noconsole
GUIアプリケーションなどを実行ファイル化する際に指定します。
実行ファイル名の指定
--nameオプションを付けて名前を指定することで実行ファイル名を指定できます。
pyinstaller test.py --name mytest --onefile
mytestという名前で実行ファイルが作成されました。
他にも様々オプションが用意されています。詳しくは公式サイトを参照してください。
LinkOptions - Using PyInstaller — PyInstaller 4.5.1 documentation
エラーが発生した時の対処法
pyinstallerは、環境によって様々なエラーが発生します。
エラーが発生した時は、--noconsoleオプションを外して--debug allオプションを付けて実行してみましょう!
pyinstaller スクリプト名 --debug all
すると、実行ログが可視化されるのでデバッグしやすくなります。
また、pyenvを使っている場合にもエラーが発生することがあります。
そんな時は以下のように、オプションを付けながらpyenvで使用するPythonを再インストールしてみましょう。
PYTHON_CONFIGURE_OPTS="--enable-shared" pyenv install 3.9.0
LINKMacでpyinstallerを使ってPythonコードから実行ファイルを生成した時の記録(OSError: Python library not found: libpython3.7m.dylib, .Python, libpython3.7.dylibの回避) - Qiita
まとめ
この記事では、Pythonファイルをexe化する方法を解説しました。
exe化することで環境に関係なく実行できるようにしました。
成果物を配布するのにとても便利です。
それでは今回の内容はここまでです。ではまたどこかで〜( ・∀・)ノ
- PyInstaller Quickstart — PyInstaller bundles Python applications


