プログラムでおかえしできるかな

Python、フェイジョア、日常のあれこれでお返し、元SEの隠居生活。

Pyinstallerの使い方【Python】

このエントリーをはてなブックマークに追加

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 を作成するには、次のことを行います。

  1. 設定ファイル settings.py を EXE に含めない(Pyinstaller で)
    --exclude-module パッケージ名 オプションで含めないモジュール(※拡張子は指定しないので注意)を指定します
    例:--exclude-module settings

  2. 設定ファイルと EXE は別に提供

    • EXE と settings.py をそれぞれ提供
    • 同じフォルダにおいて EXE を起動
  3. 実行時のパスを追加(アプリのソースで)
    設定ファイルがある(EXE がある)フォルダをインポートの検索対象にします
    つまり sys.pathsys.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-18

  • pyinstaller 実行後にできるもの
    実行したフォルダにできるもの(オプションで場所を変更可能)

    • .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

◇免責事項

ご利用に際しては、『免責事項』をご確認ください。
お気づきの点がございましたら『お問い合わせ』からお問い合わせください。

◆参考

投稿: 、更新: