【決定版】Pythonのexe軽量化テクニック5選!PyInstallerの肥大化を防ぐ方法

Python

皆さんは、自分で作った便利なPythonスクリプトを、

「他の人にも簡単に使ってほしいな」

と思ったことはありませんか?

そんな時、PyInstallerはPythonスクリプトを

exeファイルに変換してくれる、非常に強力なツールですよね。

しかし、いざ「みんなに使ってもらおう!」と張り切ってexe化してみると、

え、なんでこんなにファイルサイズが大きいの!?

と驚いた経験、一度はあるのではないでしょうか。

ちょっとしたツールのはずが、数百MBもの巨大なファイルになってしまい、

配布するのをためらってしまう…。

メールで送れないし、ダウンロードにも時間がかかる。

これでは、せっかくの便利なツールも台無しです。

今日は、そんな悩みを解決するために、

PyInstallerで作成されるexeファイルの容量を劇的に軽量化する、

効果実証済みのテクニックを5つ、厳選してご紹介します。

僕自身、最初は何も知らずに100MBを超えるexeファイルを作ってしまい、

頭を抱えていました。

Pythonで作ったアプリは配りにくい

と諦めかけていたのです。

しかし、これからお伝えする方法を試した結果、

同じプログラムを「15MB」まで軽量化することに成功したのです。

この記事を読めば、なぜexeファイルが肥大化するのかという根本原因から、

具体的な解決策まで、体系的に理解できます。

ぜひ最後まで読んで、あなたの作った便利なツールを、

スマートに、そして身軽に、多くの人に届けてあげてください。

それでは、始めていきましょう。

なぜPyInstallerでexe化すると容量が肥大化するのか?

テクニックをご紹介する前に、

まずは「なぜファイルサイズが大きくなってしまうのか

という原因を理解しておきましょう。

原因が分かれば、対策も的確に行えるようになりますし、

今後開発する際にも気をつけることができるようになります。

元凶は「Anaconda」?不要なライブラリまで巻き込む仕組み

PyInstallerの基本的な仕組みは、

あなたのPythonスクリプトを実行するために必要なものを、すべて一つのフォルダ(またはファイル)にまとめる

というものです。

これには、Pythonの実行環境本体(インタプリタ)や、

あなたがコード内で import しているライブラリなどが含まれます。

ここまでは良いのですが、問題になるケースがあります。

それは、多くの人が開発環境として利用している

Anaconda や Miniconda のような環境で、

何も考えずにexe化してしまうケースです。

これらの環境は、データ分析や機械学習でよく使われる

NumPy、Pandas、SciPy、Matplotlib といった

非常に便利なライブラリが、最初から大量に含まれています。

いわば、「何でも揃っている巨大な道具箱」の状態です。

あなたが作ったスクリプトが、

実際には単純なファイル操作しかしていなくても、

この環境下でPyInstallerを実行するとどうなるでしょうか。

PyInstallerは、少しでも関連性のありそうなライブラリを見つけると、

念のため、この環境にあるライブラリも入れておこう

と判断し、関係のない巨大なライブラリまでexeファイルに詰め込んでしまうことがあるのです。

これは、引っ越しに例えると分かりやすいかもしれません。

必要な荷物は「ダンボール一箱分」しかないのに、

家の倉庫にある「使わないガラクタ」まで全てトラックに積み込んでしまっている状態です。

これでは、荷物(ファイルサイズ)が大きくなるのは当然ですよね。

これが、肥大化の最大の原因と言っても過言ではありません。

標準ライブラリとサードパーティ製ライブラリの違い

Pythonのライブラリには、

Pythonをインストールした最初から入っている「標準ライブラリ」と、

pip install などで追加する「サードパーティ製ライブラリ」があります。

標準ライブラリ(例えば os や sys、math など)だけを使っている場合は、

そこまで巨大化することはありません。

しかし、PyInstallerは、特にサードパーティ製ライブラリを検出すると、

その依存関係を深く読み解こうとします。

このライブラリを動かすには、あれも必要かもしれない

あのライブラリが入っているなら、これもセットにしておこう

この「過剰なまでの親切心」が、

意図しないファイルの同梱につながり、

結果としてexeファイルの肥大化を招いてしまうのです。

テクニック1【効果:特大】exe化専用の「仮想環境(venv)」を作る

さて、原因が分かったところで、いよいよ具体的なテクニックに入ります。

最初にご紹介する方法が、最も効果が絶大で、

すべての基本となる考え方です。

これさえやれば、悩みの大半は解決すると言ってもいいでしょう。

それは、「exe化のためだけの、まっさらな環境を作る」ことです。

既存環境でビルドしてはいけない理由

先ほど説明した通り、普段使っている開発環境(特にAnacondaなど)には、

今回のプロジェクトでは使わないライブラリが山ほど入っています。

ゴミがたくさん入った部屋を丸ごと引っ越し荷物に詰めたら、

荷物が大きくなるのは当然です。

exe化もそれと同じです。

必要なものだけを揃えたクリーンな部屋(環境)で荷造り(exe化)をすれば、

荷物(exeファイル)は驚くほどコンパクトになります。

開発は便利なAnacondaで行い、exe化する時だけクリーンな環境で行う

この使い分けが、軽量化への最短ルートです。

コピペでOK!最低限の構成を作るコマンド手順

環境を作る」と聞くと難しく聞こえるかもしれませんが、

手順は非常に簡単です。

Pythonには venv という、

仮想環境を簡単に作るための仕組みが標準で備わっています。

プロジェクトのフォルダで、以下のコマンドを順に実行してみてください。

ぜひ、今すぐ試してみてくださいね。

1. 仮想環境の作成

まず、ターミナル(コマンドプロンプト)を開き、プロジェクトの場所に移動します。

そこで以下のコマンドを打ちます。

python -m venv venv

これを実行すると、フォルダ内に venv という名前の新しいフォルダが作られます。

これが「まっさらな部屋」です。

2. 仮想環境のアクティベート(有効化)

次に、この部屋に入ります。

  • Windowsの場合
.\venv\Scripts\activate
  • Mac / Linuxの場合
source venv/bin/activate

実行すると、コマンドプロンプトの行頭に (venv) といった表示が追加されます。

これで、「今は仮想環境の中にいますよ」という合図になります。

3. 必要なライブラリだけをインストール

このまっさらな環境には、まだ何も入っていません。

ここに、今回のプロジェクトで「本当に必要なライブラリ」と

exe化に必要な pyinstaller だけをインストールします。

例えば、pandas だけを使っているツールなら、こうです。

pip install pyinstaller pandas

ここで余計なものを入れないのがポイントです。

4. PyInstallerでビルド

準備が整いました。

このクリーンな環境で、いつも通りPyInstallerを実行します。

pyinstaller your_script.py --onefile

たったこれだけです。

Anaconda環境でそのままビルドして100MBを超えていたファイルが、

この手順を踏むだけで15MB〜20MB程度まで激減する。

そんなことも決して珍しくありません。

まずは他のテクニックを試す前に、

この「仮想環境」を作る方法を、必ず試してください。

テクニック2【効果:大】exclude-moduleで不要なモジュールを排除する

仮想環境を使っても、まだ不要なモジュールが紛れ込んでしまうことがあります。

ライブラリ同士の依存関係というのは複雑で、

Aというライブラリを入れたら、

実は裏でBというライブラリも自動で呼ばれてしまう、ということがあるからです。

特に、意図せずGUI関連のライブラリなどが含まれてしまうケースが多いです。

そんな時は、–exclude-module オプションを使って、

このモジュールは不要です!

と明示的に指定してあげましょう。

誤検知で入ってしまう「matplotlib」や「tkinter」を削る

よくある例として、数値計算ライブラリの Pandas や NumPy を使っているだけで、

グラフ描画ライブラリの matplotlib や、

ウィンドウを表示するための tkinter が勝手に含まれてしまうことがあります。

もし、あなたの作ったプログラムが、

黒い画面(コマンドプロンプト)だけで完結するツールであれば、

これらのGUIライブラリは全くの不要品です。

ただ容量を食うだけの存在になってしまいます。

これらを的確に排除することで、さらに数MBから数十MBの軽量化が期待できます。

コマンドラインでの指定方法とspecファイルの書き方

除外する方法は大きく分けて2つあります。

1. コマンドラインで直接指定する

ビルドする時のコマンドに、オプションを追加する方法です。

pyinstaller your_script.py --onefile --exclude-module tkinter --exclude-module matplotlib

このように、–exclude-module に続けて不要なモジュール名を指定します。

手軽に試せるのがメリットです。

2. specファイルに記述する(推奨)

毎回長いコマンドを打つのは大変ですし、間違える可能性もあります。

そこで、一度PyInstallerを実行すると生成される

.spec ファイルを編集するのがおすすめです。

フォルダ内にできている your_script.spec というファイルを、

メモ帳やエディタで開いてみてください。

Analysis という項目の中に、excludes という空のリストがあるはずです。

ここに、除外したいモジュールを書き込みます。

このようにリスト形式で記述します。

編集が終わったら、保存して、今度はこのspecファイルを指定してビルドします。

pyinstaller your_script.spec

こちらの方が、後から見返した時に

何を除外した設定なのか」が分かりやすく、

管理が楽なのでおすすめです。

テクニック3【効果:中】UPXを使ってバイナリ自体を圧縮する

ここまでのテクニックは

不要なものを中に入れない

というアプローチでした。

次は視点を変えて、

出来上がったもの自体をギュッと圧縮する

という方法をご紹介します。

ここで登場するのが、

UPX (Ultimate Packer for eXecutables)

というツールです。

これは、実行ファイルを圧縮するための有名なフリーソフトです。

UPXの導入方法とPyInstallerとの連携

新しいソフトを入れるの?

と思うかもしれませんが、導入はとても簡単です。

  • UPXの公式サイト から最新版をダウンロードします。
  • ダウンロードしたzipファイルを解凍します。
  • 中にある upx.exe を、プロジェクトフォルダに置くか、
  • PCの環境変数PATHが通っているフォルダに置きます。

たったこれだけで準備完了です。

PyInstallerは賢いので、ビルドする時に自動でUPXを検出し、

生成したexeファイルを圧縮してくれます。

もし自動で検出されない場合や、場所を指定したい場合は、

コマンドで明示することもできます。

pyinstaller your_script.py --onefile --upx-dir="/path/to/upx_folder/"

これにより、ビルド後のexeファイルサイズを

さらに30%〜50%程度、小さくすることができます。

あと少し小さくしたい!」という時のダメ押しに有効です。

起動速度への影響と注意点(ウイルス対策ソフトの誤検知など)

手軽にサイズを削減できる強力な方法ですが、

この方法にはいくつか知っておくべき注意点があります。

まず、起動速度への影響です。

圧縮されたexeは、実行された瞬間にメモリ上で展開する処理が入ります。

そのため、ほんのわずかですが、起動が遅くなる可能性があります。

(最近のPCであれば、体感できるほどの差ではないことが多いですが)

そして、もう一つが最大の注意点。

ウイルス対策ソフトによる誤検知です。

実行ファイルを圧縮して中身を見えにくくする挙動は、

一部のマルウェア(ウイルス)でも使われる手法です。

そのため、セキュリティソフトによっては、

あなたの作った安全なツールを「怪しいファイル」として検知し、

削除してしまうことがあります。

社内で配布する場合などは、事前に情報共有しておく必要があるかもしれません。

メリットとデメリットを天秤にかけて、

導入するかどうかを検討してみてください。

テクニック4【効果:小~中】重量級ライブラリの代替案を探す

これは少し上級者向けのアプローチですが、

根本的な軽量化に繋がります。

それは、「そもそも重たいライブラリを使わない

という選択肢を検討することです。

本当にそのPandasは必要か?CSVモジュールで代用する

例えば、あなたはCSVファイルを読み込んで、

特定の列のデータを処理したいだけだとします。

多くのPythonユーザーは、ここで思考停止で

import pandas as pd

と書いてしまいがちです。

確かにPandasは非常に高機能で便利です。

しかし、その便利さの裏には、

巨大なプログラムの塊が存在しています。

依存している NumPy なども含めると、非常に巨大なライブラリです。

もし、やっていることが単純なCSVの読み書き程度であれば、

Pythonに標準で搭載されている csv モジュールで十分かもしれません。

Pandasを使うのをやめて、標準の csv モジュールに書き換える。

これだけで、exeのサイズを数十MB単位で削減できる可能性があります。

常に、

この単純な処理のために、この巨大なライブラリは本当に必要か?

と自問自答する癖をつけると、

よりスリムで高速なプログラムが書けるようになります。

重いimport文を見直す(from importsの影響)

また、ライブラリ全体を import するのではなく、

必要な部分だけを from … import … で指定することも検討しましょう。

これにより、PyInstallerが解析する依存関係の範囲を

限定できる場合があります。

ただし、これはライブラリの内部構造に依存するため、

必ずしも劇的な効果があるわけではありません。

塵も積もれば山となる

最後の微調整、くらいの感覚で試してみる価値はあるでしょう。

テクニック5【効果:特大】PyInstallerを卒業して「Nuitka」を使う

これまでの4つのテクニックを駆使しても、

まだ満足できない。

あるいは、起動速度ももっと速くしたい。

そんな究極の軽量化と高速化を求めるのであれば、

PyInstallerとは別のツール、

Nuitka を検討する価値があります。

コンパイル方式の違い(Pythonインタプリタ vs C言語変換)

PyInstallerとNuitkaでは、exe化のアプローチが根本的に異なります。

  • PyInstaller:
    Pythonスクリプトと、それを動かすための「Pythonインタプリタ本体」を丸ごとパッケージングする方式です。いわば、Pythonそのものを持ち運んでいる状態です。
  • Nuitka:
    Pythonコードを一度、人間には読みにくい「C言語」のコードに変換します。そして、そのC言語コードをコンパイルして、PCが直接理解できる「ネイティブな実行ファイル(機械語)」を生成します。

この違いにより、NuitkaはPythonインタプリタを丸ごと同梱する必要がなく、

最適化された純粋な実行ファイルを生成できるのです。

Nuitkaならサイズ半分・速度2倍?導入のメリット・デメリット

Nuitkaを導入するメリットは絶大です。

  • メリット:
    • 劇的なサイズ削減:
      PyInstallerで軽量化したexeよりも、さらに半分以下のサイズになることも珍しくありません。
    • 実行速度の向上:
      ネイティブコードに変換されるため、プログラムの処理速度が数倍に高速化されるケースもあります。

しかし、その分デメリット、というか導入のハードルが存在します。

  • デメリット:
    • 環境構築が少し複雑:
      C言語へのコンパイルが必要なため、PCにCコンパイラ(GCCやVisual Studioなど)を別途インストールして設定する必要があります。
    • ビルドに時間がかかる:
      変換とコンパイルの工程が入るため、PyInstallerに比べてビルドに非常に長い時間がかかります。
    • 互換性の問題:
      一部の複雑なライブラリでは、うまく動作しない場合があります。

Nuitkaはまさに「最終兵器」です。

PyInstallerでの軽量化を極めた上で、

さらなる高みを目指したい場合に挑戦してみてください。

成功すれば、その軽快な動作とコンパクトなサイズに、

きっと驚くはずです。

まとめ:まずは「仮想環境」から始めよう

今回は、PyInstallerで作成したexeファイルを軽量化するための

5つのテクニックをご紹介しました。

最後に振り返っておきましょう。

  • 【効果:特大】exe化専用の「仮想環境(venv)」を作る
  • 【効果:大】exclude-moduleで不要なモジュールを排除する
  • 【効果:中】UPXを使ってバイナリ自体を圧縮する
  • 【効果:小~中】重量級ライブラリの代替案を探す
  • 【効果:特大】PyInstallerを卒業して「Nuitka」を使う

色々とご紹介しましたが、もしあなたが今、

ファイルの肥大化に悩んでいるなら、

まずは「テクニック1:仮想環境を作る」ことから始めてください。

これだけで、あなたの悩みの大半は解決するかもしれません。

それほどに効果が絶大で、かつexe化における基本中の基本です。

あなたの作った素晴らしいツールが、

巨大なファイルサイズという「足かせ」から解放され、

スマートに、そして軽快に、多くのユーザーの手元へ届くことを願っています。

配布のハードルが下がれば、

もっと多くの人にあなたのアイデアを使ってもらえるようになりますよ。

ぜひ今日から実践して、

快適なPython開発ライフを送ってくださいね。

コメント

タイトルとURLをコピーしました