PyInstaller配布
PyInstallerとは
PyInstaller は、[[Python]] のスクリプトをPythonが入っていない端末でも動く実行ファイルにまとめるツールです。インタープリタと依存ライブラリを丸ごと同梱します。
pyinstaller --onefile --windowed app.py
| オプション | 効果 |
|---|---|
--onefile | 1つの実行ファイルにまとめる(起動時に一時展開する) |
--onedir(既定) | フォルダ構成で出力する。起動が速い |
--windowed | コンソールウィンドウを出さない(GUIアプリ向け) |
配布のしやすさは --onefile が上ですが、起動のたびに一時ディレクトリへ展開するため起動が遅くなります。GUIツールのように起動回数が多いものは --onedir を圧縮して配る選択もあります。
よくある落とし穴
PyInstaller はimportを静的に解析して同梱するものを決めます。そのため、解析で見つからない依存は実行時に落ちます。
- 動的import — 文字列からモジュールを読み込む処理は追跡できません。
--hidden-importで明示します - データファイル — テンプレートやアイコンはコードではないため自動では入りません。
--add-dataで同梱を指定します - パスの扱い —
--onefileでは実行時に一時ディレクトリへ展開されるため、スクリプトからの相対パスが実行時と一致しません。同梱リソースは展開先を基準に解決します - プラットフォーム依存 — Windows用の実行ファイルはWindows上でしか作れません。配布先ごとにビルド環境が要ります
これらは開発機では動くのに配布先で落ちる形で現れます。ビルドした実行ファイルを、開発環境と別の端末で必ず一度動かして確認します。
配布手段としての位置づけ
[[デプロイ戦略]] がサーバー側の更新方法を扱うのに対し、PyInstaller が解くのは「利用者の端末に実行環境を用意させない」という別の問題です。
- 相手がターミナルを使わない → [[Tkinter/ttkbootstrap(デスクトップGUI)]] と組み合わせて実行ファイルで配る
- 相手が開発者・CIから呼ばれる → [[CLI設計(argparse・click)]] のまま、pip での導入を選ぶほうが素直
更新の配り直しが手作業になる点は弱点です。頻繁に更新するものは、実行ファイル配布より導入手順を用意するほうが結局は軽く済みます。
関連技術とのつながり
- [[Python]] — 同梱されるインタープリタと依存の元
- [[デプロイ戦略]] — 同じ「届け方」の話でも、サーバー更新とは解く問題が違う
- [[Tkinter/ttkbootstrap(デスクトップGUI)]] — 実行ファイル配布と最も相性が良い組み合わせ
- [[CLI設計(argparse・click)]] — 配布先が開発者なら pip 導入のほうが素直
Q: PyInstallerが解決する問題はどれ?
- [ ] Pythonコードの実行速度を上げる
- [x] Pythonが入っていない端末でもアプリを動かせるようにする
- [ ] 依存ライブラリの脆弱性を検出する
解説: インタープリタと依存を同梱し、実行環境の用意を利用者に求めずに済むようにするツールです。
Q: 動的importを使ったコードで起きやすい問題はどれ?
- [x] 静的解析で検出されず同梱されないため、実行時に読み込みへ失敗する
- [ ] ビルド時間が極端に短くなる
- [ ] 実行ファイルのサイズが0になる
解説: PyInstaller は import を静的に解析します。追跡できない依存は `--hidden-import` で明示します。
Q: `--onefile` の特徴として正しいものはどれ?
- [ ] 起動が最も速い
- [x] 配布は楽だが、起動時に一時展開するぶん起動が遅くなる
- [ ] 複数OS向けの実行ファイルを同時に作れる
解説: 1ファイルにまとまるため配布は簡単ですが、起動のたびに展開が走ります。OS別のビルドはそれぞれの環境で行う必要があります。