質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.31%
PyInstaller

PyInstallerは、Pythonのスクリプトを一括でWindowsなどで動く実行可能ファイルに変換できるツールです。このツールを用いることで自作のPythonプログラムを別で使用する場合でもPythonをインストールする必要がありません。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Flet

Fletは、Pythonのみでクロスプラットフォームなアプリを作成できるフレームワーク。Flutterをベースにしており、フロントエンドの経験がなくてもWeb・モバイル・デスクトップに対応したアプリを作成できます。

Q&A

0回答

145閲覧

pythonでfletライブラリを使い、pyinstallerでexe化時に画像を読み込んでくれない

dendenmushi

総合スコア98

PyInstaller

PyInstallerは、Pythonのスクリプトを一括でWindowsなどで動く実行可能ファイルに変換できるツールです。このツールを用いることで自作のPythonプログラムを別で使用する場合でもPythonをインストールする必要がありません。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Flet

Fletは、Pythonのみでクロスプラットフォームなアプリを作成できるフレームワーク。Flutterをベースにしており、フロントエンドの経験がなくてもWeb・モバイル・デスクトップに対応したアプリを作成できます。

0グッド

0クリップ

投稿2023/09/24 02:08

編集2023/09/24 02:09

実現したいこと

fletライブラリとpyinstallerでexe化し、画像を読み込ませて表示したい

前提

python3.10
pyinstaller
flet
Macbook pro OS Monterey 12.3.1

実行

pip install pyinstaller % pyinstaller file.py --add-data 'assets/neko.png:.' --onefile

該当のソースコード

python

1import flet as ft 2import os 3import sys 4 5if getattr(sys, 'frozen', False): 6 # exeファイルから実行されている場合 7 base_path = sys._MEIPASS 8else: 9 # Pythonスクリプトとして実行されている場合 10 base_path = os.path.dirname(os.path.abspath(__file__)) 11 12image_src = os.path.join(base_path, "assets", "neko.png") 13 14print('base_path:', base_path) 15print('image_src:', image_src) 16 17 18def main(page: ft.Page): 19 page.window_top=50 20 page.window_left=150 21 page.window_width=350 22 page.window_height=400 23 image_change = ft.Image(src=f"/neko.png") 24 25 page.add( 26 ft.Row( 27 [ 28 ft.Container( 29 ft.Column( 30 [ 31 ft.Image(src=image_src, 32 width=110, 33 height=150, 34 fit=ft.ImageFit.CONTAIN, 35 ), 36 ], 37 scroll=ft.ScrollMode.AUTO, 38 ), 39 #expand=True, 40 margin=10, 41 padding=10, 42 bgcolor=ft.colors.AMBER_400, 43 border_radius=10, 44 alignment=ft.alignment.top_center, 45 ) 46 ], 47 ), 48 ) 49if __name__ == "__main__": 50 ft.app(target=main)

ディレクトリ

main_directory----file.py |__assets |____neko.png

発生している問題・エラーメッセージ

python file.py実行後の画像

python file.pyコマンドで実行するとしっかり出力

しかしpyinstallerにより作成されたdistフォルダにできたものをダブルクリックで実行しても以下になっていました。

結果

試したこと

python

1if getattr(sys, 'frozen', False): 2 # exeファイルから実行されている場合 3 base_path = os.path.dirname(sys.executable) 4else: 5 # Pythonスクリプトとして実行されている場合 6 base_path = os.path.dirname(os.path.abspath(__file__))

distフォルダを取ってくることなどで目当ての画像が取得できませんでした。
どのようにしたらexe化時に目当ての画像を取得できるでしょうか。
--onefileを使わないでディレクトリごとというのは避けています。exeファイルで一本化したいと考えています。アドバイス頂けないでしょうか。よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2023/09/24 02:48

base_path = os.path.dirname(sys.executable) と base_path = os.path.dirname(os.path.abspath(__file__)) とで、パスに違いがあって読み込めないのだと思います。 これらのパスから、ユーザー名などを伏せた状態のパスを共有可能ですか?
dendenmushi

2023/09/24 10:34 編集

ありがとうございます。結果は以下になります。 pythonファイル実行時 base_path: /Users/user/miniforge3/envs/py310/bin base_path: /Users/user/work/■■■ exeファイル実行時 base_path: /Users/user/work/■■■■/dist base_path: /var/folders/_d/g■■■■■■■■■■■■■000gn/T/_MEI5db0oI このような結果になりました。
退会済みユーザー

退会済みユーザー

2023/09/24 21:36 編集

Exeの時と、python直の時でuser/users/workまでは共通していますね。プログラムにはどちらから起動したかを取得できるようですので、 1「user/users/work」を含むパスを取得する 2文字列から余計な文字列を取り除く で共通のアドレスは拾えそうですーーーが、多分それはcurrent working directoryではないですよね。 なので、別の方法、例えば「print(os.get_cwd())」や、プログラム起動時の引数0番目(普通はプログラムのパス)を取れると良いですが…。プログラムの引数は「print(sys.argv)」で確認できます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.31%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問