cx_freezeでインストーラを作成する方法

# 概要
この記事ではcx_freezeを使用してインストーラを作成する方法を紹介しています。
インストーラを作成するときに、デスクトップおよびスタートメニューのショートカットの作成有無やアイコンの設定などもできる方法となります。

# cx_freezeのインストール
cx_freezeは以下のコマンドでインストールできます。
```
pip install cx_freeze
```
    
# cx_freezeでインストーラを作成
1. まず、cx_freezeでインストーラを作成するには以下のsetup.pyを作成する (コピペでOK)
    ```python
    import sys
    from cx_Freeze import setup, Executable
    
    ##############################################
    ##############################################
    ##############################################
    # 以下はアプリごとに変更
    
    # バージョン
    VERSION = "1.0"
    # アプリ名
    APP_NAME = "Test App"
    # exeファイル名 (フォルダ名などになるためスペース等が無い方がよい)
    EXE_NAME = "TestApp"
    # アプリの説明
    DESCRIPTION = "テストアプリ"
    # 作成者
    AUTHOR = "Author"
    # 含めたいライブラリ等
    PACKAGES = ["numpy", "matplotlib"]
    # 含めたいファイルやフォルダ
    INCLUDE_FILES = ["icons/"]
    # Pythonのソースコードファイル名
    SCRIPT_FILENAME = "app.py"
    # アイコンファイルパス (Noneでなしに設定)
    ICON_PATH = "icons/icon.ico"
    # デスクトップにショートカットを作成するか
    ADD_DESKTOP_SHORTCUT = True
    # スタートメニューにショートカットを追加するか
    ADD_START_MENU_SHORTCUT = True
    # コンソール画面を無効化するか
    WITHOUT_CONSOLE = True
    # UUID (一度決めたら変更しない)
    UUID = "00000000000000000000000000000000"
    
    ##############################################
    ##############################################
    ##############################################
    # 以下は基本的に変更しない
    
    exe_name_without_dot_exe = defines.EXE_NAME.replace(".exe", "")
    exe_name_with_dot_exe = exe_name_without_dot_exe + ".exe"
    
    shortcut_table = list()
    if ADD_DESKTOP_SHORTCUT:
        shortcut_table.append(
            (
                "DesktopShortcut",  # Shortcut
                "DesktopFolder",  # Directory
                APP_NAME,  # Name
                "TARGETDIR",  # Component_
                "[TARGETDIR]" + exe_name_with_dot_exe,  # Target
                None,  # Arguments
                None,  # Description
                None,  # Hotkey
                "" if ICON_PATH is not None else None,  # Icon
                0 if ICON_PATH is not None else None,  # IconIndex
                None,  # ShowCmd
                "TARGETDIR",  # WkDir
            )
        )
    
    if ADD_START_MENU_SHORTCUT:
        shortcut_table.append(
            (
                "StartMenuShortcut",  # Shortcut
                "ProgramMenuFolder",  # Directory
                APP_NAME,  # Name
                "TARGETDIR",  # Component_
                "[TARGETDIR]" + exe_name_with_dot_exe,  # Target
                None,  # Arguments
                None,  # Description
                None,  # Hotkey
                "" if ICON_PATH is not None else None,  # Icon
                0 if ICON_PATH is not None else None,  # IconIndex
                None,  # ShowCmd
                "TARGETDIR",  # WkDir
            )
        )
    
    # Now create the table dictionary
    msi_data = {"Shortcut": shortcut_table}
    
    # Change some default MSI options and specify the use of the above defined tables
    bdist_msi_options = {"upgrade_code": UUID, "add_to_path": False, "data": msi_data}
    
    build_exe_options = {
        "packages": PACKAGES,
        # 取り込みたいファイルやフォルダ名を記載します。
        "include_files": INCLUDE_FILES,
    }
    
    base = None
    if sys.platform == "win32" and WITHOUT_CONSOLE:
        base = "Win32GUI"
    
    setup(
        name=exe_name_without_dot_exe,
        version=VERSION,
        description=DESCRIPTION,
        author=AUTHOR,
        options={"build_exe": build_exe_options, "bdist_msi": bdist_msi_options},
        executables=[
            Executable(
                script=SCRIPT_FILENAME,  # メインのPythonスクリプト
                base=base,
                target_name=exe_name_with_dot_exe,  # ビルド後の実行ファイル名
                icon=ICON_PATH,
            ),
        ],
    )

    
    ```
    <br>

2. 次に、setup.pyの内容を自分のアプリ用に変更する

    以下は設定する必要のある内容です。
    |名称|変数名|説明|
    |---|---|---|
    |アプリバージョン|VERSION|アプリのバージョンを"1.0"のように入力|
    |アプリ名|APP_NAME|アプリの名前(スペースありでもよい)|
    |exeファイル名|EXE_NAME|フォルダ名等に使用(スペース等が無い方がよい)|
    |アプリ説明|DESCRIPTION|説明はなくてもよい|
    |作成者|AUTHOR|アプリの作成者|
    |パッケージ|PACKAGES|アプリに使用しているライブラリを記載|
    |含めたいファイル|INCLUDE_FILE|インストーラに含めたいファイル|
    |スクリプト|SCRIPT_FILENAME|Pythonで作成した.pyファイル|
    |アイコン|ICON_PATH|アイコンファイル(Noneでなし)
    |デスクトップショートカット|ADD_DESKTOP_SHORTCUT|デスクトップにショートカットを作成するかどうか|
    |スタートメニューショートカット|ADD_START_MENU_SHORTCUT|スタートメニューにショートカットを作成するかどうか|
    |コンソール画面無効化|WITHOUT_CONSOLE|黒いコンソール画面を表示するか|
    |UUID|UUID|アプリケーションを一意に識別するためのID|
    
    
    <br>

    
3. インストーラを作成する
    setup.pyの上部分に必要な情報を記載したら、あとは以下のコマンドを実行してインストーラを作成すれば完了です。
    ```
    python setup.py bdist_msi
    ```
    <br>
4. 完成したインストーラを確認する
    完成したインストーラは`dist`というフォルダの中に入っています。  
    自分のPCにインストールして、動作等を確認してください。

# 終わりに
cx_freezeを使用してPython用のexeインストーラを作成する方法を紹介しました。
pyinstallerがよく使われると思うので、cx_freezeの情報を集めることが大変だったのでこの記事が参考になれば幸いです。