🐍

PyInstallerの問題を回避してcx_Freezeでexeファイルをビルドする方法

2024/06/13に公開

はじめに

PyInstallerは,Pythonプロジェクトを実行可能ファイル(exeファイル)に
パッケージ化するための広く使用されているツールです.
しかし,時にはPyInstallerを使用する際に問題が発生することがあります.
私は最近,Flaskで通販サイトを個人開発しており,PyInstallerでexeファイルをビルドしようとしたところ,エラーが発生するという問題に遭遇しました.
調査の結果,アンチウィルスソフトがPyInstallerのアップデート時に不具合を引き起こしている可能性があることがわかりました.
この記事では,PyInstallerの問題を回避し,cx_Freezeを使用してexeファイルを正常にビルドできたので共有しようと思います.

実行環境

  • Windows(10 or 11)
  • Windows用ソースコードエディター(VS codeなど)
  • Python 3.10.9

PyInstallerのエラーについて

PyInstallerを使用してexeファイルをビルドしようとしたとき,以下のようなエラーメッセージが表示されました.

PyInstaller does not include a pre-compiled bootloader for your platform

このエラーは,PyInstallerがお使いのプラットフォーム用にコンパイル済みのブートローダーを含んでいないことを示しています.ブートローダーは,PyInstallerがexeファイルを作成するために必要な重要なコンポーネントです.
通常,PyInstallerは自動的に適切なブートローダーを選択しますが,何らかの理由でこのプロセスが失敗することがあります.私の場合,アンチウィルスソフト(ESET)が原因で
PyInstallerのアップデート時に不具合が生じたようです.アンチウィルスソフトがPyInstallerのファイルを誤ってブロックしたり,変更したりすることがあるため,このような問題が発生する可能性があります.

cx_Freezeを使用する方法

PyInstallerの問題を回避するために,別のツールであるcx_Freezeの使用を検討しました.cx_Freezeは,PyInstallerと同様に,Pythonプロジェクトをexeファイルにパッケージ化するためのツールです.cx_Freezeは,Pythonコードとその依存関係を単一の実行可能ファイルにバンドルすることができます.

cx_Freezeを使用するには,まず以下のコマンドを使用してcx_Freezeをインストールします.

pip install cx_Freeze

次に,setup.pyファイルを作成し,cx_Freezeの設定を行います.setup.pyファイルは,cx_Freezeがexeファイルをビルドするための指示を提供します.以下は,setup.pyファイルの例です.

setup.py
import sys
from cx_Freeze import setup, Executable

build_exe_options = {
    "packages": ["os", "subprocess"],
    "includes": ["run"],
}

setup(
    name="Shopping", # アプリケーションの名前
    version="1.0", # バージョン
    description="Shopping Application", # 説明
    options={"build_exe": build_exe_options}, # ビルドオプション
    executables=[Executable("setup.py", base=None, icon="icon.ico")], # 実行ファイルの情報
)

このsetup.pyファイルでは,build_exe_optionsを使用して,パッケージ化に含めるパッケージやモジュールを指定します.
setup()関数は,アプリケーションの名前,バージョン,説明,ビルドオプション,実行ファイルの情報を記入します.

cx_Freezeを使用してexeファイルをビルドする

cx_Freezeを使用してexeファイルをビルドするには,以下の手順を実行します.

  1. コマンドプロンプトまたはターミナルを開きます.
    余談ですが・・・
    Windwos検索バーから「cmd」と入力し,開く人と
    Win + Rからcmdと入力し開く人と二種類います.
    私は後者派ですね.
  2. プロジェクトのディレクトリに移動します.
  3. 以下のコマンドを実行して,exeファイルをビルドします.
python setup.py build

ビルドが完了すると,buildディレクトリにexeファイルが生成されます.
cx_Freezeは,指定されたオプションに基づいて
exeファイルをビルドします.ビルドプロセスには,
Pythonコードとその依存関係の解析,必要なファイルのコピー,
実行可能ファイルの作成などが含まれます.

cf.インストーラーの作成

cx_Freezeでビルドしたexeファイルを配布するために,
インストーラーを作成することができます.
インストーラーとは,ユーザーがアプリケーションを
簡単にインストールできるようにするための
セットアッププログラムです.

インストーラーを作成するには,
InnoSetupなどのツールを使用します.InnoSetupは,Windowsインストーラーを作成するための無料のツールです.
以下は,InnoSetupを使用してインストーラーを作成する手順です.

  1. InnoSetupをダウンロードしてインストールします.
  2. setup.issファイルを作成し,インストーラーの設定を行います.
    以下は,setup.issファイルの例です.
    setup.iss
    [Setup]
     AppName=Shopping
     AppVersion=1.0
     DefaultDirName={pf}\Shopping
     OutputDir=.
     OutputBaseFilename=Shopping-Setup
     SetupIconFile=icon.ico
     Compression=lzma
     SolidCompression=yes
     
     [Files]
     Source: "build\exe.win-amd64-3.12\*"; DestDir: "{app}"; Flags: recursesubdirs
     Source: "app\*"; DestDir: "{app}\app"; Flags: recursesubdirs
     Source: "config.py"; DestDir: "{app}"
     Source: "requirements.txt"; DestDir: "{app}"
     Source: "run.py"; DestDir: "{app}"
     Source: "setup.bat"; DestDir: "{app}"
     
     [Icons]
     Name: "{commonprograms}\Shopping"; Filename: "{app}\setup.exe"
     Name: "{commondesktop}\Shopping"; Filename: "{app}\setup.exe"; IconFilename: "{app}\icon.ico"; Tasks: desktopicon
     
     [Tasks]
     Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}"
    
    このsetup.issファイルでは,インストーラーの名前,バージョン,出力ディレクトリ,ファイルの含有,アイコンの設定などを指定します.
  3. InnoSetupコンパイラを使用して,setup.issファイルをコンパイルし,インストーラーを作成します.

まとめ

この記事では,PyInstallerの問題を回避し,cx_Freezeを使用してexeファイルを正常にビルドする方法について説明しました.PyInstallerでエラーが発生した場合,cx_Freezeは実行可能ファイルを作成するための優れた代替手段となりました.今回はcx_Freezeを使用しましたが,別の方法もあると思います.もしご存じの方がいらっしゃれば教えていただけると幸いです.

その他リソース

cx_Freezeとインストーラーの作成の詳細については,以下のリソースを参照してください.

Discussion