Python

【Python】Pythonファイルを実行ファイルに変換する方法【exe化】

この記事では、Pythonファイルを実行ファイルに変換する方法を解説します。

実行ファイル化(exe化)することでPythonがインストールされていない環境でもPythonプログラムを実行することができます

それにより作成したプログラムを配布したりすることができます。

それでは、Pythonファイルをexe化する方法を見ていきましょう!

実行ファイルとは?

実行ファイルとは、exeファイル(エグゼファイル)やexecファイルなどの総称でダブルクリックするだけで処理を実行できるファイルのことを言います。

実行ファイルは、必要な環境(ここではPyhton)がインストールされていない場合でも処理を実行することができます。

それにより、幅広く配布が可能となります。

Linkexeファイル (エグゼファイル)とは|「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典

実行ファイル化(exe化)

それでは、Pythonファイルをexe化する方法を見ていきましょう!
ここでは、人気の高いpyinstallerを使用します。

pyinstallerのインストール

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.pyexe化して実行しても以下のようにエラーが発生する。

上記ではファイルが見つからないってエラーが出ていますね。それではexe化した際に生成されたspecファイルに使用するファイルを追加してみましょう。

specファイルのAnalysisdatasに以下のような形式で追加します。

('追加するファイルやディレクトリのパス', '追加する場所(ディレクトリ)')

同ディレクトリ内にある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化することで環境に関係なく実行できるようにしました。
成果物を配布するのにとても便利です。

それでは今回の内容はここまでです。ではまたどこかで〜( ・∀・)ノ