Day After Day
tsurezure naru mamani...
ANOTHER DECADE

from 2021 when it's begining after/with CORONA Virus.

PyInstaller 使用時の注意事項

5月
20
2026
Back
HOME


Created with ChatGPT

Python スクリプトを Windows の EXE ファイルにコンパイルするときに、いろいろの問題が発生した。備忘録として残しておかないと、毎回嵌まり込むことになる

単純なフォルダ構成の時はそれ程問題とならないが、同じフォルダに somethinf.py と something.json が有って、pythonファイルはコンパイル後見えない様に(include)、 json ファイルは編集可能なように、フォルダとも表に出す(見えるようにする)などが絡んでくると、中々動いてくれない。

Python ソースコード側での工夫が必要


kivy に関する記述

  1. PyInstaller がファイルを読み込むとき、Pythonの実行環境を優先するか無視するかを判断。resource_path として返す

  2.     # Pyinstaller ファイル読み込み helper
        def resource_path(self, relative_path):
    
            # PyInstaller が追加する sys.frozen = True をチェック
            if getattr(sys, "frozen", False):			# Python自身の実行環境情報を持つ標準モジュールsys
                # True なら PyInstallerの展開先を参照(_internal)
                return Path(sys._MEIPASS) / relative_path
            # 開発環境ならプロジェクトフォルダ参照
            return Path(__file__).resolve().parent.parent / relative_path
    

  3. 上の判断でコマンド起動時はフォルダ構成のとおりの Path で稼働するが、 コンパイル時は icon/ファイル、ui/kivyレイアウトファイル共に _internal フォルダに片付く。

  4. class DStarApp(App):
    
        def build(self):
            # タイトルとUIコントロールファイルの指定
            self.title = (f'D-STAR Chat ({APP_NAME}) v.{VERSION}')
     
            # アイコンファイルの指定
            self.icon = str(self.resource_path("icon/d-chat.png"))
    
            self.ui = Builder.load_file(
                str(self.resource_path("ui/main.kv"))
            )
            
            return self.ui
    
    アイコンファイルの設定については、リソースパスからコンパイル時(Windows)読めるように(つまり、上のリソースパスを使う)しておかないと、アプリのタイトルバー左端にアイコンが表示されない。 又、このアイコンを表示させるためには元データとして icon.ico ではなく icon.png を使う必要が有った。

PyInstaller でコンパイルするときのコマンド列


  1. コマンド列に必要なフォルダ構成を明記する。1行を改行接続マーク [`](PowerShell用)を付けて書いています。(Bashの [\])

  2. pyinstaller main.py `
    	--onedir `			# アプリとして一つのフォルダにまとめる
    	--noconsole `			# コンソール無しのGUIアプリとする
    	--name=d-chat `			# アプリ名の指定 (d-chat.exe となる)
    	--clean `			# 前回のキャシュや一時ディレクトリを削除、初期化
    	--add-data "ui;ui" `		# ui フォルダを表に出さず _internal フォルダにまとめる
    	--add-data "assets;assets" `	# ui 同様
    	--add-data "icon;icon" `	# ui 同様
    	--icon=icon/d-chat.ico		# kivy のアイコン指定以外のアイコン表示を指定する。

  3. Pythonファイルとユーザファイルが混在するフォルダ

  4. コマンドによる指定等を必要とせず、結果 Pythonファイルはアプリに組み込まれ、フォルダとユーザファイル(設定ファイル、hosts.txt など)は表に残る。

kivyのレイアウトファイルを書くときの VSCode 拡張機能について


Windowsに移植するとき、編集しようとしたら kivy ファイルについて拡張機能がインストールされていなかったので適当に入れたら、いきなり叱られた。 kivy ファイルのトップには、Bash で書く( #!/bin/bash )ような宣言が必要だとエラー表示が出る。 #:kivy 1.0 のようにバージョンを書けと言う。 Python側でも kivy を呼び出すときに、指定してきっちりバージョン合わせをするのだそうだ。

ただ、調べて見ると小規模かつプライベートツールなどでは必ずしも必要無いようだ。 では、この気になる警告ラインは何とかならないかと、Linux ではエラーにならなかったので、拡張機能を同じものにしたところ Windowsでもエラーが消えた。

Geminiに訊いてみたら、VS Code 拡張機能の誤検知と書いてあった。KvLang という拡張機能なら悩まされない。(作る規模にもよるが・・)

Back
HOME