PyInstaller 使用時の注意事項
Back
HOME
Created with ChatGPT
Python スクリプトを Windows の EXE ファイルにコンパイルするときに、いろいろの問題が発生した。備忘録として残しておかないと、毎回嵌まり込むことになる
単純なフォルダ構成の時はそれ程問題とならないが、同じフォルダに somethinf.py と something.json が有って、pythonファイルはコンパイル後見えない様に(include)、
json ファイルは編集可能なように、フォルダとも表に出す(見えるようにする)などが絡んでくると、中々動いてくれない。
Python ソースコード側での工夫が必要
kivy に関する記述
- PyInstaller がファイルを読み込むとき、Pythonの実行環境を優先するか無視するかを判断。resource_path として返す
# 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
- 上の判断でコマンド起動時はフォルダ構成のとおりの Path で稼働するが、
コンパイル時は icon/ファイル、ui/kivyレイアウトファイル共に _internal フォルダに片付く。
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行を改行接続マーク [`](PowerShell用)を付けて書いています。(Bashの [\])
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 のアイコン指定以外のアイコン表示を指定する。
- Pythonファイルとユーザファイルが混在するフォルダ
コマンドによる指定等を必要とせず、結果 Pythonファイルはアプリに組み込まれ、フォルダとユーザファイル(設定ファイル、hosts.txt など)は表に残る。
kivyのレイアウトファイルを書くときの VSCode 拡張機能について
Windowsに移植するとき、編集しようとしたら kivy ファイルについて拡張機能がインストールされていなかったので適当に入れたら、いきなり叱られた。
kivy ファイルのトップには、Bash で書く( #!/bin/bash )ような宣言が必要だとエラー表示が出る。 #:kivy 1.0 のようにバージョンを書けと言う。
Python側でも kivy を呼び出すときに、指定してきっちりバージョン合わせをするのだそうだ。
ただ、調べて見ると小規模かつプライベートツールなどでは必ずしも必要無いようだ。
では、この気になる警告ラインは何とかならないかと、Linux ではエラーにならなかったので、拡張機能を同じものにしたところ Windowsでもエラーが消えた。
Geminiに訊いてみたら、VS Code 拡張機能の誤検知と書いてあった。
KvLang という拡張機能なら悩まされない。(作る規模にもよるが・・)
Back
HOME

この 作品 は
クリエイティブ・コモンズ 表示 - 非営利 - 改変禁止 4.0 国際 ライセンス
の下に提供されています。
English
Powered by