Python アプリを Python 環境を持たないユーザーに使ってもらえるように EXE 化する Pyinstaller の使い方を解説します。
目次
Pyinstaller は、Python のソースコードから EXE ファイルを作成するツールです。
いくつかのオプションを理解すれば簡単に使えます。
EXE 化するにあたって一つのフォルダにまとめる方法と一つのファイルにまとめる方法があります。
一つのファイルにまとめる方法を基準に解説します。
◆インストール
pip install pyinstaller
★仮想環境で使う場合はそれぞれの環境でインストール(あるいはアップデート)します。
引き継いだままの Pyinstaller で作成した EXE だとうまく動作しません。
仕様サイト:PyInstaller Manual — PyInstaller 6.x.0 documentation
◆EXE作成方法
基本的な使い方はオプション、ソース(スクリプト)ファイル名を指定して実行することです。
一度実行するとスペックファイル(拡張子が spec
のファイル)が作られます。
2回目からはそれを指定して実行することもできます。
【構文】
pyinstaller オプション スクリプト.py
pyinstaller スペックファイル.spec
よく使う使い方(例)
pyinstaller -F myscript.py
myscript.py から myscript.exe を作成します
EXE ファイルだけを作成します
起動時にコマンドプロンプトが開きますpyinstaller myscript.spec
最後に実行したのと同じオプションで再作成しますpyinstaller -F -w --exclude-module settings myscript.py
myscript.py から myscript.exe を作成します
EXE ファイルだけを作成します
起動時にコマンドプロンプトが開きません
settings モジュールを EXE に含めません
◇Pyinstallerの主なオプション
Pyinstaller のオプションをこちらにまとめました。
オプション | 内容 |
---|---|
-F --onefile |
One-File モード(EXE ファイルだけを提供する形)で EXE を作成dist フォルダに EXE だけを作成※実行時に解凍する分、起動時間が掛かります |
-D --onedir |
One-Folder モード(フォルダを提供する形)で EXE を作成(配布はフォルダ以下)dist フォルダにスクリプトファイルと同じ名(拡張子名を除く)のフォルダが生成され exe が作られますデフォルト( -F を指定しない時)の動作※フォルダが既にあるとエラーになるので2回目以降は削除しておきます |
-w --noconsole --windowed |
実行時にコマンドプロンプト画面を表示しません |
-c --console --nowindowed |
実行時にコマンドプロンプト画面を表示します デフォルト( -w を指定しない時)の動作 |
--hide-console hide-early --hide-console minimize-late --hide-console hide-late --hide-console minimize-early |
実行時にコマンドプロンプト画面を自動的に非表示または最小化(Windows のみ) 既に起動されているコマンドプロンプトから EXE を実行した場合は動作しません -c と併せて指定します |
-i file.ico --icon file.ico |
エクスプローラで表示されるアイコンを指定 file.ico:ico ファイルのパス 他に EXE ファイルを指定する方法などがありますが省略 |
--exclude-module パッケージ名 |
指定したパッケージまたはモジュールを EXE に含めません ※パッケージ名はファイル名ではありません( .py 不要) |
--additional-hooks-dir HOOKSPATH |
フックを検索するための追加のパス。複数回使用可 |
--hidden-import MODULENAME --hiddenimport MODULENAME |
インポートすべきモジュールが見つけられない時に検索させるモジュール名を指定します。複数回使用可 |
--add-data SOURCE;DEST |
バイナリではないデータの取り込み。(主にテキストデータ)複数回使用可 SOURCE:取り込むパス(フォルダ可)、DEST:保存先。※UNIX は ; ⇒: |
--add-binary SOURCE;DEST |
バイナリの取り込み。(アプリ、画像など)複数回使用可 例: --add-binary app-used-image.png;. SOURCE:取り込むパス(フォルダ可)、DEST:保存先。※UNIX は ; ⇒: |
--collect-all モジュール名 |
指定したパッケージまたはモジュールからすべてのサブモジュール、データ ファイル、バイナリを収集します。複数回使用可 |
--collect-data モジュール名 |
指定されたパッケージまたはモジュールからすべてのデータを収集します。複数回使用可 例: --collect-data unidic_lite |
--distpath DIR |
EXE または EXE を含むフォルダ を配置する場所(デフォルト: ./dist ) |
--specpath DIR |
スペックファイルを配置する場所(デフォルト: . ) |
--version-file FILE |
EXE ファイルにバージョン情報を付加します FILE:Windowsのバージョンリソースファイル (バージョンリソースファイルの作り方は省略) |
◆オプションの使い方いろいろ
オプションの使い方を目的別に説明します。
◇設定ファイルsettings.pyを使えるようにする
設定ファイルとして settings.py を使い 1、Pyinstaller で EXE を作る場合、
設定ファイルを EXE に含めてしまうとユーザーが編集できなくなってしまいます。
それを回避するために EXE を作成するには、次のことを行います。
設定ファイル settings.py を EXE に含めない(Pyinstaller で)
--exclude-module パッケージ名
オプションで含めないモジュール(※拡張子は指定しないので注意)を指定します
例:--exclude-module settings
設定ファイルと EXE は別に提供
- EXE と
settings.py
をそれぞれ提供 - 同じフォルダにおいて EXE を起動
- EXE と
実行時のパスを追加(アプリのソースで)
設定ファイルがある(EXE がある)フォルダをインポートの検索対象にします
つまりsys.path
にsys.executable
(設定ファイルの実行時のパス)を追加します
例:sys.path.append( os.path.dirname( sys.executable))
import settings
※アプリのソースが EXE ファイルの解凍先にあってもsys.executable
は EXE のあるフォルダを示します
◇tkinterdnd2ライブラリを使う
tkinterdnd2 ライブラリ(Tkinter でドラッグアンドドロップを実現するライブラリ)を
使ったアプリに対して Pyinstaller を使う場合、
hook-tkinterdnd2.py
を Github から取得して保存先をオプションで指定する必要があります。
【対応方法】
hook-tkinterdnd2.py
を Github から取得- 取得先:GitHub - pmgagne/tkinterdnd2
hook-tkinterdnd2.py
を開く- Raw をクリック
- 「名前を付けてページを保存」を実施(そのままの名前で保存)
pyinstaller
を実行するフォルダへコピーpyinstaller
に次のオプションを追加--additional-hooks-dir .
※任意のフォルダにコピーしてそのフォルダを指定でよいと思いますが試していません m(__)m
根拠となる説明文
If you want to use pyinstaller, you should use the hook-tkinterdnd2.py file included. Copy it in the base directory of your project, then:
pyinstaller -F -w myproject/myproject.py --additional-hooks-dir=.
tkinterdnd2 · PyPI
◇No module named ...のエラーがでる場合
通常、Pyinstaller は、ソースファイルでインポートしているモジュールを見つけようとします。
このエラーが出る場合、該当のモジュールを見つけられていません。
Pyinstaller は、すべてのインポートされたモジュールを見つけられるわけではありません。
したがってこのエラーが出た場合、オプションで検索場所を指定します。
【指定するオプション】
--hidden-import MODULENAME
または --hiddenimport MODULENAME
例:--hiddenimport babel.numbers
※エラーで出てくるパッケージを指定します。
※ここで指定したモジュールは sys.path
に場所を登録しなくても検索されます。
◇ファイルを同梱する
画像ファイルや JSON 型式のデータなどを同梱することができます。
--add-data SOURCE;DEST
または --add-binary SOURCE;DEST
オプションを使用します。
例:--add-data scripts\fu_collage.py;.\scripts\
※仕様に書かれている記述方法だと動きませんでした。
- ✖:
--add-data "scripts\fu_collage.py;.\scripts\"
- ◎:
--add-data scripts\fu_collage.py;.\scripts\
保存先を「.
」とした場合、実行時に同梱したファイルを参照するには、
- One-File モード:起点は展開されたフォルダ。一時フォルダなので次の方法でパスを取得します
- One-Folderモード:起点はパッケージされたフォルダ。ファイル名だけでアクセス可能
【同梱データ参照先パスの取得方法】
EXE の展開先パスは sys._MEIPASS
属性に設定されます。
これは、Pyinstaller で作成した EXE を実行した場合に追加される属性です。
それの有無で起動方法を判別します。
以下は、判別方法のサンプルです。
def get_meipass(): if hasattr(sys, "_MEIPASS"): return sys._MEIPASS # 実行ファイルで起動した場合 else: return "." # pythonコマンドで起動した場合
※仕様では getattr(sys, 'frozen', False) and hasattr(sys, '_MEIPASS')
としていますが端折りました。
◇EXEに独自アイコンを設定する
Pyinstaller で作成した EXE をエクスプローラーで見た時に表示されるアイコンを変更することができます。
-i file.ico
または -icon file.ico
オプションを使用します。
例:-i file.ico
アイコンにはもう一つあります。
アプリのウインドウに表示されるもので、設定方法が異なります。
アイコン画像の作り方と併せて解説記事を出していますので参考にしてください。
参照自記事:📖 TkinterタイトルバーアイコンとEXEアイコンの設定方法【Python】 🔗
◆その他のヒント
その他 Pyinstaller を使用していて気が付いた点を紹介します。
コマンドライン引数について
作成した EXE ファイルにコマンドライン引数を渡せるかを確認しました
sys.argv
で問題なく取れますEXE の解凍と実行
-F
オプションを指定して作成した EXE ファイルは、圧縮されています。
実行時に、まず解凍されます
解凍先は次のフォルダです%USERPROFILE%/AppData/Local/Temp/_MEI[ランダムな英数字]/
この展開されたフォルダのパスは前述の
sys._MEIPASS
で得ることができますEXE が動かないとき(デバッグ)
どこかでエラーになっていると思われる場合
--console
オプションを指定して EXE を作成し、コマンドプロンプトから実行します
コマンドプロンプトにエラーが表示されますPyinstaller で作った EXE がウイルスと誤認識される場合
せっかく EXE を作成してもアンチウイルスソフトにウイルスと誤認識される場合があります
その場合の回避方法を記事にしてありますのでご参照ください
📖 Pyinstallerで作ったEXEがウイルスと誤認識される時の回避方法【Python】🔗
根本的な回避方法はありませんが、対処方法を記事にしてありますのでご参照ください
📖 Pyinstallerで作ったEXEはウイルスと誤認識されるのでユーザーに例外登録してもらうしかないようだ【Python】 🔗
更新:2024-10-18pyinstaller 実行後にできるもの
実行したフォルダにできるもの(オプションで場所を変更可能).spec
ファイル:スペックファイルdist
フォルダ :EXE を保存build
フォルダ:ログなど
◆スペックファイル
Pyinstaller を実行するとスペックファイルが作成されます。
このファイルは、ソースファイルと同じ名前で拡張子が spec
となり、
カレントディレクトリ(オプションで変えられます)に作成されます。
このファイルを使用して前回と同じオプションで Pyinstaller を再実行できます。
このファイルは上書きされるので残したい場合は、リネームします。
スペックファイルを使った Pyinstaller の実行は、次の通りです。
pyinstaller スペックファイル名
スペックファイルの中身を修正すれば、オプションを変えて実行することもできます。
スペックファイルの中身について、ここでは説明しません。
※個人的にスペックファイルの中身を理解するよりオプションを理解して実行する方を推奨します。
(私にはスペックファイルの仕様を覚えるよりオプションを覚える方が好ましく思えました)
※何度も実行したり、都度オプションを変更したりする場合は、バッチファイルを用意するのが良いと思います。
▽バッチファイルサンプル
pyinstaller -F -w ^
--icon ..\..\ふくろうアイコン.ico ^
--exclude-module settings ^
myscript.py
※行末に ^
を入力すると改行できます。
◆さいごに
Pyinstaller の使い方をまとめました。
自分で使用している機能を基本に紹介しています。
説明が不足している部分があればご容赦ください。
今後、新たな使い方をした場合には更新していきたいと思います。
◇ご注意
本記事は次のバージョンの下で動作した内容を基に記述しています。
- Python 3.8.5
- pyinstaller 6.10.0
- Windows 64ビット OS
◇免責事項
ご利用に際しては、『免責事項』をご確認ください。
お気づきの点がございましたら『お問い合わせ』からお問い合わせください。
◆参考
- PyInstaller 仕様:Using PyInstaller — PyInstaller 6.x.0 documentation