本文へスキップ

Python アプリの Windows インストーラーを作る(PyInstaller から Setup.exe へ)

PyInstaller で Python プログラムを固め、その出力をショートカットとアンインストーラー付きの本格的な Windows インストーラーにまとめます。インストーラーには onedir が onefile より適している理由と、重要な設定を解説します。

更新日 2026年10月31日 · 読了 6 分

PyInstaller は Python プログラムを、Python が入っていない環境でも動く Windows の .exe に変換します。ただし、そのプログラムをインストールしてくれるわけではありません。スタートメニューの項目も、アンインストーラーも、Windows の設定への登録もありません。そのためには PyInstaller の出力をインストーラーで包みます。スクリプトから Setup.exe までの流れをまとめて説明します。

ステップ 1:PyInstaller でアプリを固める

プロジェクトの環境に PyInstaller をインストールし、エントリースクリプトのあるフォルダーからビルドします。

pip install pyinstaller
pyinstaller --noconsole --onedir --name MyApp --icon app.ico main.py

各フラグの意味は次のとおりです。

  • --onedir(デフォルト)は、MyApp.exe とライブラリの入った _internal/ フォルダーを含む dist/MyApp/ フォルダーを生成します。インストーラーにはこちらを使ってください。起動のたびに一時フォルダーへ展開する必要がないため --onefile より起動が速く、ウイルス対策ソフトのヒューリスティック検出にも引っかかりにくくなります。
  • --noconsole は GUI アプリ(Tkinter、PyQt、Kivy など)で黒いコンソールウィンドウを非表示にします。コマンドラインツールでは付けないでください。
  • --icon app.ico はアイコンを .exe に埋め込みます。インストーラーにも同じ .ico を使ってください。
  • --name MyApp は実行ファイルと出力フォルダーの名前を指定します。

プログラムが実行時に開くデータファイル(画像、設定テンプレート、モデルなど)は、--add-data "src;dest" か .spec ファイルで追加しないと dist/MyApp/ に含まれません。

dist/MyApp/MyApp.exe を開いて、アプリが動くことを確認します。可能であれば dist/MyApp フォルダーをまるごと Python の入っていない別の Windows PC にコピーし、そこでも動かしてみてください。

ステップ 2:出力フォルダーを zip にする

dist/MyApp/ の中身、つまり MyApp.exe と _internal/ を zip にまとめます。build/ や .spec ファイル、ソースツリーは含めないでください。インストールされるのはこの zip の中身そのもので、1 バイトも変わりません。

ステップ 3:インストーラーをビルドする

  1. zip を ExeTup にアップロードします。MyApp.exe がメインプログラムとして検出されます。
  2. アプリ名、バージョン、発行元、必要ならライセンスを入力します。
  3. すべてのユーザー(Program Files、管理者の確認あり)か現在のユーザー(管理者権限不要)を選びます。同僚に配布するツールは、ユーザー単位のインストールのほうがうまくいくことが多いです。
  4. アーキテクチャを選びます。PyInstaller は実行した Python に合わせてビルドするので、64 ビットの Python なら 64 ビットのアプリになります。
  5. app.ico をアップロードし、必要なショートカットを有効にしてビルドします。
  6. Setup.exe をダウンロードし、Windows でテストします。

Python 固有の注意点

  • ウイルス対策ソフトの誤検知。 PyInstaller のバンドルは、過剰に慎重なウイルス対策ソフトのヒューリスティック検出に引っかかりやすく、特に --onefile ビルドが狙われます。通常のインストーラーに入れて Program Files に置かれた onedir ビルドは他のプログラムと同じように振る舞い、検知される可能性が下がります。コード署名を行えばさらに効果的です。
  • サイズ。 Tkinter アプリは 20〜40 MB、PyQt、NumPy、PyTorch を使うとそれよりはるかに大きくなります。インストーラーの LZMA 圧縮で通常は半分ほどになります。使っていないモジュールは --exclude-module で除外して、軽く保ちましょう。
  • 初回起動。 onedir は展開が不要なので、初回起動も 2 回目以降と同じ速さです。
  • アップデート。 バージョン番号を上げた新しいインストーラーを配布します。前のバージョンの上にインストールすると、ファイルがその場で置き換わります。
  • コンソールツール。 コマンドラインプログラムの場合はマシン単位のインストールを検討し、インストール先フォルダーをユーザーに伝えてください。インストーラーは PATH に追加しません。

代替手段

Nuitka や cx_Freeze も .exe を含むフォルダーを生成し、インストーラーの手順は同じです。インストーラースクリプトを自分で書きたい場合は、NSIS も Inno Setup も PyInstaller の出力に対応しています。

よくある質問

インストーラーには --onefile と --onedir のどちらを使うべきですか?

--onedir です。インストーラーがすでにユーザーに単一の Setup.exe を提供するので、onefile の遅い起動や一時フォルダーへの展開を受け入れる理由がありません。onedir は PyInstaller のデフォルトでもあります。

ユーザーは Python をインストールする必要がありますか?

いいえ。PyInstaller が Python インタープリターとライブラリをフォルダーにまとめ、インストーラーがそのフォルダーをユーザーのマシンに配置します。

Windows が私のインストーラーに警告を出すのはなぜですか?

新しく署名のないダウンロードファイルは、評価が蓄積されるまで Microsoft SmartScreen に引っかかります。対処法は SmartScreen のガイドを参照してください。

サンプルの設定ファイルやデータフォルダーを同梱できますか?

できます。PyInstaller の --add-data で追加して _internal/ の中に入れるか、ExeTup の「その他のファイル」ステップで追加して MyApp.exe の隣に置いてください。

関連ガイド