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

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

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

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

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

2回答

3711閲覧

Python exe化したGUIアプリ、起動したらFatal Errorになる

saya24

総合スコア222

PyInstaller

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

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

1グッド

0クリップ

投稿2020/06/30 11:21

編集2020/06/30 13:13

一つのPythonのファイルについて 開発作業を終えたので PyInstallerで exe化を図ったのですが、
仕上がったexeファイルを実行すると 以下のとおり致命的エラーを招きます。
ここまできて?!

【exe化の作業の上で心配している点】
勉強がてらPythonのコーディングしていた際と違い、プログラムファイル(.py)と同じパスに置かれたフォルダ内の画像や
ありとあらゆるパッケージ・モジュールを多用して 完成させました。
それでいて、ドス窓からPyInstallerを利用する際に指定したのは .pyのファイルだけ、
プログラムの中で利用している画像のためのフォルダ、パッケージは PyInstallerから認識できているのかなぁ という不安があります。

以下コマンドを実行しました。

py -m PyInstaller C:\Users\hoge\source\repos\MARTINEZ\MARTINEZ\MARTINEZ.py --onefile --noconsole

--noconsoleのオプションを外して仕上がげたEXEを 実行した結果になります。

22:11PM

実行結果

teamikl👍を押しています

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

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

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

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

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

teamikl

2020/06/30 12:17 編集

(noconsoleではエラー原因が解らない為) --noconsole オプションを消して、コンソールに出力されるエラーを提示してください。 --onefile オプションでは、画像などのリソースはEXEファイル内に含まれ 実行時にTempなどへ展開されるようになります。 ソースコード側で実行時情報からPATHを得るように対応が必要です。 (_MEIPASSで検索すると対応方法の情報が見つかります) 他にも、デバッグ時とexe化後では実行時の環境が変わる為、 `sys.argv[0]` や `__file__`といった実行時情報の扱いは、別途対応が必要です。 pyinstaller Run-time Information https://pyinstaller.readthedocs.io/en/stable/runtime-information.html
saya24

2020/06/30 12:29

いつもお世話になっております。 分かりやすいところから対応していきます。 まずPyInstaller実行時に --noconsoleの指定をやめるところからですね
saya24

2020/06/30 12:52

本文に PyiIstallerの実行結果を貼り付けなおしました。 仰られていたのは --noconsoleを外してexe化し 仕上がったexeを実行した結果をこちらに貼ることですよね?? exeが仕上がらなくなってしまいました。 おっとベルマークが
teamikl

2020/06/30 12:55 編集

C:\Users\hoge> で実行してますが、これは前回と同じですか? (同じ条件で 再度--noconsole付ければ成功しますか?)
teamikl

2020/06/30 12:56

順序的には --noconsole 付きでビルドして 先にエラーメッセージを確認した方が良さそうです。 回答は、画像等のリソースを含める場合の対応方法になります。
saya24

2020/06/30 13:03

すみません、コマンドを間違えておりました。--noconsoleを指定しないバージョンのexe、無事仕上がりました。 アカウントを隠して 実行コマンドをこちらに貼り付けたのですが、それを再利用してしまいました。 今から仕上がったexe(--noconsoleを指定しないバージョン)の実行して 結果を本文に貼り付けます。
teamikl

2020/06/30 13:18

> 22:11PM更新分 ログを見た限り、画像の参照に失敗しているので 回答に書いた対応を試してみてください - exeファイルに画像を含める方法 (--onefileの場合、--add-dataで指定) - 実行時の画像のpath を実行時情報 sys._MEIPASS から得る
guest

回答2

0

ベストアンサー

プログラムの中で利用している画像のためのフォルダ、パッケージは PyInstallerから認識できているのかなぁ という不安があります。

自動で認識されないので、これは追加で指定が必要ですね。
ディレクトリ構成次第ですが、一例を挙げるとコマンドラインで指定する場合は
--add-binary "images/*.png;images" ← ; の左側がプロジェクト内で参照する画像のpath/ 右側が実行時展開されるフォルダ

一度実行した後に生成されるspec ファイル編集でも指定できます。


ファイルのPATHについては、

ファイルを相対パスでしている場合は全て修正が必要です。

ファイルのpath所得方法を、スクリプトを実行した場合と、
exe化してから実行した場合で別ける必要があります。

デバッグ時は、大抵スクリプトファイルのある場所がカレントディレクトリですが、
インストール後は、exeファイルの場所がカレントディレクトリとは限らない点にも注意。

追記: コード側の対応方法 (resource_path 関数はbundling-data-files-with-pyinstaller-onefile から借用

import os import sys import tkinter as tk def resource_path(relative_path): try: # PyInstaller creates a temp folder and stores path in _MEIPASS base_path = sys._MEIPASS except Exception: base_path = os.path.abspath(".") return os.path.join(base_path, relative_path) IMG_PATH = resource_path("./images/sample.png") def main(): root = tk.Tk() photo = tk.PhotoImage(file=IMG_PATH) button = tk.Button(root, image=photo) button.pack() root.mainloop() if __name__ == '__main__': main()

投稿2020/06/30 12:50

編集2020/06/30 14:14
teamikl

総合スコア8664

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

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

saya24

2020/06/30 13:17

やはり、カッコつけて行った TkInterのフォーム右上のアイコンを変えている画像を 読み込めていない、という問題でしょうか.... PyInstallerのコマンド実行時に 画像フォルダのありかを宣言する必要がある、ということでしょうか? 例を示して頂きましたが imagesフォルダに png gif 色々入っていて利用しました
teamikl

2020/06/30 13:24

画像の参照ができてないようですね。対応手順としては上記の2点です ・--add-data でEXEファイルに画像をリソースとして含める ・上述の様な resource_path 関数を使い、デバッグ時とEXE後でのファイルのPATHを切り替える
saya24

2020/06/30 13:29

ご見解をありがとうございます。 初歩的なことの確認ですが、2点とは いづれかですか、それとも両方施さなければなりませんでしょうか? 一先ず --add data の方策を今からとってみようと思いますが 例に挙げて頂いているのは ワイルドカードが効く? ということでしょうか? 分かりが悪くて本当に恥ずかしいのですが
teamikl

2020/06/30 13:40

両方必要です。 --add-data で画像を exe ファイル内に含める。 --onefileで作成されたexeは、実行するとTemp 以下にファイルを全て展開します。 (これはプロセスが終了すると自動的に消えるので気にする必要はありません) その時展開される path が sys._MEIPASS に設定されるので、 sys._MEIPASSが設定されている場合(=EXE化した場合)はそちらからファイルを読み込むようにPATHを変更します。 ---- ワイルドカードは有効です。--add-data を複数回指定も可能です。 複数の多様なファイルを含めたい場合は、specファイルに記述した方が良いかもしれません。
saya24

2020/06/30 13:47

両方なんですね、やはり聞いてよかったです。ちょっと お時間がかかりそうです(泣)。 仕上がったはずと思ったコードに手を入れることになるとは.... --add-data"images/*.png;images" という例を示して頂きましたが この例では imagesフォルダ内の 拡張子pngしか 適用されないということでしょうか? この他 gif や icoが 同フォルダから参照されている作りなのですが --add-dataを PyInstallerに併記するのでしょうか?? 何から何まで聞いてすみません
teamikl

2020/06/30 14:14 編集

後少し・・と言いたいところですが、--onefile する場合は実行環境が変わり 他の問題を引き起こすことも有るので。地道に対応していくしかないですね。 EXE化に関しては --noconsoleなしをデバッグ用として、--noconsoleありをリリース用で再度テストが必要です。 ワイルドカードで良いのですが、imagesフォルダ内全てなら pyinstaller --onefile --add-binary "images;images" 他のオプション・・・というコマンドになります https://pyinstaller.readthedocs.io/en/stable/usage.html#options-group-what-to-bundle-where-to-search ※ 区切り文字の ; は windowsの場合です。 ※ 左側の images はプロジェクト外から実行の場合はフルパスで記載してください。 pyinstaller --onefile --add-binary"C:\Users\hoge\source\repos\MARTINEZ\images;images" ・・・ 訂正: --add-data -> --add-binary の方が良さそうです。 binary は DLL ファイルなどが対象と公式のマニュアルで読んだのですが、 例文に png ファイルも --add-binaryで設定している例がありました。
teamikl

2020/06/30 14:16

回答も --add-data -> --add-binary に変更しました。 ですが、自分の環境(win10 python3.8.3) では --add-data でも成功してます。 (簡単なサンプルしか試してません)
saya24

2020/06/30 14:23

ご親切な提案をいつもありがとうございます。 PyInstallerの実行時には --add-binaryで 対応することにします。 明朝にはプログラム側の改修を終えて 報告できるようにします。まずはお礼まで
saya24

2020/07/01 05:45

teamiklさん ご提案頂きました改修を済ませ かつコマンドプロンプトからPyInstallerでEXE化する際に 画像のイメージファイルをありかを指定する手立てで 無事に動作するEXEを仕上げることができました。 至れりつくせりのご対応ありがとうございました、またご連絡遅くなり申し訳ありません。 EXE化のあとには あとで 相応の動作検証が必要のようですねl デバッグ実行時には 気が付けない 盛り込むべき仕様があること 痛感致しました。 またご支援を頂けたら幸いです。明らかに 追加で対応しなければならない仕様があるみたいで頭が痛いです
guest

0

プログラムファイル(.py)と同じパスに置かれたフォルダ内の画像や

ありとあらゆるパッケージ・モジュールを多用して 完成させました。

実行ファイルと同じフォルダにそれらはあるんでしょうか

ValueError: script 'C:\Users\hoge\source\repos\MARTINEZ\MARTINEZ\MARTINEZ.py' not found

存在しないとおっしゃってます

投稿2020/06/30 12:49

y_waiwai

総合スコア87749

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

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

saya24

2020/06/30 13:01

あちゃ~失敗しました、こちらに実行コマンドを貼り付ける際、当方のPC上のアカウントを隠すため hoge にしたのですが それを再利用(--noconsoleでコマンドたたくとき)してしまいました。 できました、noconsleのVerのexeが。 今から実行して 結果を本文に貼り付けます。
y_waiwai

2020/06/30 13:04

なんか変わってるようには見えませんが。。
saya24

2020/06/30 13:13 編集

本文への 貼り付け 只今完了しました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問