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:インストーラーをビルドする
- zip を ExeTup にアップロードします。
MyApp.exeがメインプログラムとして検出されます。 - アプリ名、バージョン、発行元、必要ならライセンスを入力します。
- すべてのユーザー(Program Files、管理者の確認あり)か現在のユーザー(管理者権限不要)を選びます。同僚に配布するツールは、ユーザー単位のインストールのほうがうまくいくことが多いです。
- アーキテクチャを選びます。PyInstaller は実行した Python に合わせてビルドするので、64 ビットの Python なら 64 ビットのアプリになります。
app.icoをアップロードし、必要なショートカットを有効にしてビルドします。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 の隣に置いてください。
関連ガイド
- Windows アプリの Setup.exe を作る方法(コード不要)Setup.exe が実際に行うこと、作成する3つの方法、そしてインストーラースクリプトを書かずにアプリのフォルダーを数分でプロ品質のインストーラーに変える方法を解説します。
- .exe を Windows インストーラーにする方法(exe から Setup.exe へ)単体の .exe や .exe を含むフォルダーを、インストーラースクリプトを書かずに、ショートカットとアンインストーラー付きの本格的な Windows インストーラーに変換する方法。
- 「Windows によって PC が保護されました」:SmartScreen 警告の意味と消し方新しいインストーラーで Windows が「発行元不明」の警告を表示する理由、ユーザーが押せるボタン、そしてコード署名と評価によって警告が消える仕組みを解説します。