PyInstaller

【Python】PyInstallerでスクリプトをexe化する方法

【Python】PyInstallerでスクリプトをexe化する方法

Python開発においてPyInstallerを使ってスクリプトをexe化する方法について解説します。

Pythonスクリプトのexe化

Pythonでは、インタープリタで実行する言語のため実行のためPythonをインストールして実行環境を整える必要があります。

LinuxやmacOSといった開発者に優しいOSであれば、Python環境はインストール済みのため困ることは少ないですが、Windows環境でPython実行環境となると少し話が変わってきます。

特にWindowsのユーザーはデスクトップのアプリケーション(exeファイル)をクリックして実行できることを期待する人が多いのではないでしょうか。Windows向けにPythonアプリケーションを配布する時にはPythonスクリプトをexe化して配布できると便利です。

本記事では、Pythonスクリプトをexe化する方法のうち、おすすめのツールであるPyInstallerの使い方を中心に紹介します。

Note

コードを実行ファイルとしてexe化するということはコードを読んだり改変したりといったことは難しくなります。

ユーザーがIT技術のある人の場合は、アプリケーションコードに触れる自由度を残しておく方が便利な場合があります。このあたりはプロジェクトごとに検討するとよいでしょう。

Pythonスクリプトのexe化で人気のあるツール

Pythonでは、スクリプトをexe化する機能は標準ではサポートされていません。しかし、いくつかの人気のあるツールがあります。よくツールとして候補になるツールを対応しているプラットフォームと共に簡単にまとめます。

ツール名対応プラットフォーム
PyInstallerWindows, Linux, macOS, AIX, Solaris, FreeBSD, OpenBSD
cx_FreezeWindows, Linux, macOS
py2exeWindows
py2appmacOS

PyInstallerは、Pythonスクリプトをexe化するツールの中では最も先進的なプログラムで、対応するプラットフォームも非常に多く、一番おすすめできます。本記事では後ほど使い方を紹介しますが、簡単なコマンドでPythonスクリプトをexe化できます。

cx_Freezeは、メジャーなWindows, Linux, macOSに対応しています。PyInstallerは独自のビルドフォーマットを提供しますが、cx_Freezeはdistutilsパッケージを拡張しているため、パッケージ配布に関わるsetup.pyスクリプトが使われます。既にパッケージ配布でsetuptools等を使用しているのであればcx_Freezeが使いやすいかもしれません。

py2exepy2appは異なるツールですが、使用方法や制約等が類似しています。py2exeはWindows向けのビルド、py2appはmacOS向けのビルドといったように単一のプラットフォームしか対応していません。PyInstallerやcx_Freezeよりも制約があり柔軟性に劣ると言われています。

上記の通りPyInstallerかcx_Freezeが主な選択肢になるかなと思いますが、いずれのツールを使うにしてもプロジェクトの始めに決めておくことがおすすめです。後々で決めるとうまくビルドできるツールが見つからないというようなことが起こりえます。プロジェクトの開始時に決めておけば開発を進めながらツールにあわせた調整がしやすくなります。

以降では、一番おすすめできるPyInstallerを中心に使い方を紹介していきます。

PyInstallerは、クラスプラットフォームのビルドはサポートされていないので注意しましょう(cx_Freezeも同様)。特定のプラットフォームで動く実行形式にビルドしたい場合は、同じ環境でビルドする必要があります。近年ではVagrant等の仮想化ツールがあるため、うまく活用するとよいかと思います。

PyInstaller

以降では、PyInstallerの使い方を紹介していきます。PyInstallerの公式ページは、こちらを参照してください。

PyInstallerのインストール

PyInstallerは、以下のようにpipコマンドを使ってインストールできます。完了すればPyInstallerを使える環境が整います。

pip install pyinstaller

基本的な使い方

PyInstallerの基本的な使い方を見ていきましょう。こちらのページで作成した簡易csvエディタ(csv_editor.py)をexe化して使えるようにしてみたいと思います。簡易csvエディタのPythonコードをcsv_editor.pyとして任意のフォルダに配置し、同フォルダにて以下のコマンドを実行してください。

pyinstaller csv_editor.py

実行すると以下のような感じで処理が実行され、commpleted successfullyと表示されればビルドが完了です。表示が長いので以下では途中を省略しています。

1183 INFO: PyInstaller: 5.13.0
1183 INFO: Python: 3.11.2
1196 INFO: Platform: Windows-10-10.0.19045-SP0
1197 INFO: wrote D:\PycharmProjects\python-tech-sample-source\python-libraries\pyinstaller\csv_editor.spec
(...途中省略...)
15503 INFO: Building COLLECT COLLECT-00.toc completed successfully.

出力結果のフォルダ構成は以下のような形となります。こちらも長くなるので一部省略しています。

>tree /f  
D:.
│  csv_editor.py
│  csv_editor.spec
│
├─build
│  └─csv_editor
│      │  Analysis-00.toc
│      │  base_library.zip
│      │  COLLECT-00.toc
│      │  csv_editor.exe
│      │  csv_editor.exe.manifest
│      │  csv_editor.pkg
│      │  EXE-00.toc
│      │  PKG-00.toc
│      │  PYZ-00.pyz
│      │  PYZ-00.toc
│      │  warn-csv_editor.txt
│      │  xref-csv_editor.html
│      │
│      └─localpycs
│              pyimod01_archive.pyc
│              pyimod02_importers.pyc
│              pyimod03_ctypes.pyc
│              pyimod04_pywin32.pyc
│              struct.pyc
│
└─dist
    └─csv_editor
        │  api-ms-win-core-console-l1-1-0.dll
        │  api-ms-win-core-datetime-l1-1-0.dll
        │  api-ms-win-core-debug-l1-1-0.dll
        │  (...省略...)
        │  base_library.zip
        │  csv_editor.exe
        │  libcrypto-1_1.dll
        │  libssl-1_1.dll
        │  python3.dll
        │  python311.dll
        │  (...省略...)
        │
        └─PyQt6
            │  QtCore.pyd
            │  QtGui.pyd
            │  QtWidgets.pyd
            │  sip.cp311-win_amd64.pyd
            │
            └─Qt6
                ├─bin
                │      MSVCP140.dll
                │      MSVCP140_1.dll
                │      MSVCP140_2.dll
                │      opengl32sw.dll
                │      Qt6Core.dll
                │      (...省略...)
                │
                ├─plugins
                │  ├─generic
                │  │      qtuiotouchplugin.dll
                │  │
                │  ├─iconengines
                │  │      qsvgicon.dll
                │  │
                │  ├─imageformats
                │  │      qgif.dll
                │  │      qicns.dll
                │  │      qico.dll
                │  │      (...省略...)
                │  │
                │  ├─platforms
                │  │      qminimal.dll
                │  │      qoffscreen.dll
                │  │      qwindows.dll
                │  │
                │  └─styles
                │          qwindowsvistastyle.dll
                │
                └─translations
                        qtbase_ar.qm
                        qtbase_bg.qm
                        qtbase_ca.qm
                        (...省略...)

dist/csv_editorというフォルダにはユーザーに配布可能なビルド済みのアプリケーション(csv_editor.exe)が生成されます。このフォルダには、アプリケーションの実行に必要となるDLL等が含まれるため、このフォルダごとユーザーに配布するようにしてください。

なお、pyinstallerコマンドにはオプションが用意されているため、以下のようにonefileオプションを指定するとよりコンパクトな配布物を生成することができます。pyinstallerのオプションについてはこちらを参照してもらえればと思います。

pyinstaller --onefile csv_editor.py
>tree /f  
D:.
│  csv_editor.py
│  csv_editor.spec
│
├─build
│  └─csv_editor
│      │  Analysis-00.toc
│      │  base_library.zip
│      │  csv_editor.exe.manifest
│      │  csv_editor.pkg
│      │  EXE-00.toc
│      │  PKG-00.toc
│      │  PYZ-00.pyz
│      │  PYZ-00.toc
│      │  warn-csv_editor.txt
│      │  xref-csv_editor.html
│      │
│      └─localpycs
│              pyimod01_archive.pyc
│              pyimod02_importers.pyc
│              pyimod03_ctypes.pyc
│              pyimod04_pywin32.pyc
│              struct.pyc
│
└─dist
        csv_editor.exe

上記のように、onefileオプションを使った場合には、csv_editor.exeというexeファイルのみが生成されます。小規模なプログラムの場合はこちらのオプションを使う方がいいかと思います。

実際に、csv_editor.exeを実行すると以下のように簡易csvエディタの画面表示して使うことができました。

簡易csvエディタ

specファイル

PyInstallerでPythonスクリプトをexe化する場合には、specファイル(*.spec)というものができます。

specファイルは生成されたPythonモジュールでソースコードからどのようにアプリケーションを構築するかといった内容が出力されています。今回ご紹介した例のcsv_editor.specは以下のような内容になっています。

# -*- mode: python ; coding: utf-8 -*-


block_cipher = None


a = Analysis(
    ['csv_editor.py'],
    pathex=[],
    binaries=[],
    datas=[],
    hiddenimports=[],
    hookspath=[],
    hooksconfig={},
    runtime_hooks=[],
    excludes=[],
    win_no_prefer_redirects=False,
    win_private_assemblies=False,
    cipher=block_cipher,
    noarchive=False,
)
pyz = PYZ(a.pure, a.zipped_data, cipher=block_cipher)

exe = EXE(
    pyz,
    a.scripts,
    [],
    exclude_binaries=True,
    name='csv_editor',
    debug=False,
    bootloader_ignore_signals=False,
    strip=False,
    upx=True,
    console=True,
    disable_windowed_traceback=False,
    argv_emulation=False,
    target_arch=None,
    codesign_identity=None,
    entitlements_file=None,
)
coll = COLLECT(
    exe,
    a.binaries,
    a.zipfiles,
    a.datas,
    strip=False,
    upx=True,
    upx_exclude=[],
    name='csv_editor',
)

このspecファイルには、pyinstallerの実行のために必要な引数が含まれています。一度specファイルが生成されると以下のようなコマンドでビルドを実行することができます。

pyinstaller csv_editor.spec

specファイルをカスタマイズすることでビルドの挙動を変更することができます。ただ、ほとんどのアプリケーションのビルドは複雑な設定の変更をしなくても基本的な使い方で紹介したようなシンプルなコマンド実行でexe化が実現できるかと思います。

まとめ

Python開発においてPyInstallerを使ってスクリプトをexe化する方法について解説しました。

Pythonでは、スクリプトをexe化する機能は標準ではサポートされていませんが、PyInstaller, cx_Freeze, py2exe, p2appといった人気のツールがあります。本記事では、その中でも対応プラットフォームが多く一番おすすめできるPyInstallerについて使い方を紹介しました。

PyInstallerは簡単なコマンドでPythonスクリプトをexe化できます。また、実行時に生成されるspecファイルをカスタマイズすることでビルドを拡張するといったことも可能になります。

アプリケーションを配布する場合にはexe化ができると便利な場合があります。PyInstallerは使い方も簡単なので是非試してみてもらえたらなと思います。

Note

PyInstallerの公式ドキュメントはこちらを参考にしてください。