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

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

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

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

Q&A

0回答

88閲覧

pyinstallerでEXE化したファイルでエラーが発生する

kabo0406

総合スコア0

PyInstaller

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

0グッド

0クリップ

投稿2024/11/12 07:51

実現したいこと

EXE化したファイルを自分のPCで実行すると問題なく動作するのですが、他社に渡したときにエラーが発生して実行できません。numpyのパージョンエラーのようなのですが、エラーを解消する方法を教えてください。

発生している問題・分からないこと

EXEファイルを開き、アプリの実行ボタンを押下するとエラーが出ます

エラーメッセージ

error

1Running script: C:\Users\HARUKI~1.KAN\AppData\Local\Temp\_MEI216922\tokutyouryou2.py with args: () 2Traceback (most recent call last): 3File "C:\Users\HARUKI~1.KAN\AppData\Local\Temp\_MEI216922\tokutyouryou2.py", line 1, in <module> 4import pandas as pd 5File "C:\Users\haruki.a.kanno\AppData\Local\Programs\Python\Python312\Lib\site-packages\pandas\init.py", line 39, in <module> 6from pandas.compat import ( 7File "C:\Users\haruki.a.kanno\AppData\Local\Programs\Python\Python312\Lib\site-packages\pandas\compat\init.py", line 26, in <module> 8from pandas.compat.numpy import is_numpy_dev 9File "C:\Users\haruki.a.kanno\AppData\Local\Programs\Python\Python312\Lib\site-packages\pandas\compat\numpy\init.py", line 9, in <module> 10_np_version = np.version 11^^^^^^^^^^^^^^ 12AttributeError: module 'numpy' has no attribute 'version' 13Error: tokutyouryou2.py の実行中にエラーが発生しました。

該当のソースコード

yosokuAPP.py

1import customtkinter as ctk 2import tkinter as tk 3from tkinter import messagebox, filedialog 4import subprocess 5import os 6import threading 7import sys 8 9# 基準パスを取得する関数 10def get_base_path(): 11 """PyInstallerのEXE環境で正しく動作する基準パスを取得""" 12 return getattr(sys, '_MEIPASS', os.path.dirname(os.path.abspath(__file__))) 13 14# グローバル変数でプロセスとスレッドを管理 15current_process = None 16current_thread = None 17stop_thread = threading.Event() # スレッド停止用のフラグ 18 19# 他のスクリプトの実行関数 20def run_script(script_name, *args): 21 global current_process 22 if current_process is not None and current_process.poll() is None: 23 print(f"{script_name} はすでに実行中です。新しいプロセスは開始されません。") 24 return 25 26 # exeファイルが実行されているディレクトリを取得 27 script_path = os.path.join(get_base_path(), script_name) 28 29 # スクリプトの存在確認 30 if not os.path.exists(script_path): 31 append_log_message(f"Error: {script_name} が見つかりません。") 32 messagebox.showerror("エラー", f"{script_name} が見つかりません。") 33 return 34 35 def run(): 36 global current_process 37 try: 38 append_log_message(f"Running script: {script_path} with args: {args}") 39 current_process = subprocess.Popen( 40 ["python", script_path, *args], 41 stdout=subprocess.PIPE, 42 stderr=subprocess.STDOUT, 43 text=True, 44 bufsize=1, 45 universal_newlines=True 46 ) 47 for line in current_process.stdout: 48 append_log_message(line.strip()) 49 50 current_process.stdout.close() 51 current_process.wait() 52 53 if current_process.returncode == 0: 54 append_log_message(f"{script_name} の実行が成功しました。") 55 messagebox.showinfo("完了", f"{script_name} の実行が成功しました。") 56 else: 57 append_log_message(f"Error: {script_name} の実行中にエラーが発生しました。") 58 59 except subprocess.CalledProcessError as e: 60 append_log_message(f"Error: {str(e)}") 61 messagebox.showerror("エラー", f"{script_name} の実行中にエラーが発生しました。\n{e}") 62 finally: 63 current_process = None 64 65 threading.Thread(target=run).start() 66 67# メイン画面に戻る際に現在の処理をキャンセルする関数 68def cancel_and_return(return_func): 69 global current_process, current_thread, stop_thread 70 stop_thread.set() # スレッド停止フラグを立てる 71 72 if current_process is not None: 73 current_process.terminate() 74 current_process = None 75 76 if current_thread is not None and current_thread.is_alive(): 77 current_thread.join() # スレッドが終了するのを待つ 78 79 stop_thread.clear() # フラグをリセット 80 return_func() 81 82# ログを表示するための関数 83def append_log_message(message): 84 if log_text: 85 log_text.config(state='normal') 86 log_text.insert(tk.END, message + "\n") 87 log_text.see(tk.END) 88 log_text.config(state='disabled') 89 90# ログをクリアするための関数 91def clear_log(): 92 if log_text: 93 log_text.config(state='normal') 94 log_text.delete(1.0, tk.END) 95 log_text.config(state='disabled') 96 97# 特徴量と学習期間の選択画面を表示 98def show_feature_selection_screen(): 99 global log_text 100 # ウィジェットのクリア 101 for widget in root.winfo_children(): 102 widget.destroy() 103 104 # ログウィジェットの作成とクリア 105 log_text = tk.Text(root, height=20, wrap='word', state='disabled') 106 clear_log() 107 108 # 「戻る」ボタン 109 back_button = ctk.CTkButton(root, text="メイン画面に戻る", command=lambda: cancel_and_return(show_main_screen), width=200) 110 back_button.pack(pady=10) 111 112 # 実行ボタン 113 execute_button = ctk.CTkButton(root, text="特徴量と学習期間分析を実行", command=analyze_features_and_periods, width=200) 114 execute_button.pack(pady=10) 115 116 # ログ表示用のTextウィジェットを追加 117 log_text.pack(padx=10, pady=10, fill='both', expand=True) 118 119 # ウィンドウのサイズを調整 120 root.geometry("500x600") 121 122# 予測生成画面を表示 123def show_forecast_generation_screen(): 124 global log_text 125 # ウィジェットのクリア 126 for widget in root.winfo_children(): 127 widget.destroy() 128 129 # 「戻る」ボタン 130 back_button = ctk.CTkButton(root, text="メイン画面に戻る", command=lambda: cancel_and_return(show_main_screen), width=200) 131 back_button.pack(pady=10) 132 133 # 実行ボタン 134 execute_button = ctk.CTkButton(root, text="予測生成を実行", command=generate_forecast, width=200) 135 execute_button.pack(pady=10) 136 137 # ログ表示用のTextウィジェットを追加 138 log_text = tk.Text(root, height=20, wrap='word', state='disabled') 139 log_text.pack(padx=10, pady=10, fill='both', expand=True) 140 clear_log() 141 142 # ウィンドウのサイズを調整 143 root.geometry("600x700") 144 145# メイン画面のUIを設定 146def show_main_screen(): 147 global button1, button2, close_button, label0, label1 148 root.geometry("400x500") # メイン画面用にウィンドウサイズを縮小 149 for widget in root.winfo_children(): 150 widget.destroy() 151 152 # ラベルやボタンを再生成 153 label0 = ctk.CTkLabel(root, text="汎用予測アプリ", text_color="#87ceeb", font=custom_font0) 154 label1 = ctk.CTkLabel(root, text="実行したいオプションを選択してください。", text_color="#000000", font=custom_font1) 155 button1 = ctk.CTkButton(root, text="特徴量と学習期間の選択", command=show_feature_selection_screen, width=200) 156 button2 = ctk.CTkButton(root, text="予測生成", command=show_forecast_generation_screen, width=200) 157 close_button = ctk.CTkButton(root, text="終了", command=close_window, width=200) 158 159 label0.pack(pady=(60, 5)) 160 label1.pack(pady=(10, 20)) 161 button1.pack(pady=10) 162 button2.pack(pady=10) 163 close_button.pack(pady=10) 164 165# ウィンドウを閉じる処理 166def close_window(): 167 global current_process, current_thread 168 if current_process is not None: 169 current_process.terminate() # プロセスを終了 170 current_process = None 171 if current_thread is not None and current_thread.is_alive(): 172 current_thread.join(timeout=1) 173 current_thread = None 174 root.quit() 175 root.destroy() 176 177def analyze_features_and_periods(): 178 script_name = "tokutyouryou2.py" 179 run_script(script_name) 180 181def generate_forecast(): 182 script_name = "yosoku2.py" 183 run_script(script_name) 184 185# メインウィンドウの初期化 186root = ctk.CTk() 187root.title("汎用予測アプリ") 188root.geometry("400x500") # 初期のウィンドウサイズをコンパクトに設定 189 190custom_font0 = ctk.CTkFont(family="Meiryo UI", size=24, weight="bold") 191custom_font1 = ctk.CTkFont(family="Meiryo UI", size=12) 192 193# 最初にメイン画面を表示 194show_main_screen() 195 196# メインループの開始 197root.mainloop() 198

試したこと・調べたこと

  • teratailやGoogle等で検索した
  • ソースコードを自分なりに変更した
  • 知人に聞いた
  • その他
上記の詳細・結果

ChatGPTで確認して何度も修正しましたが、ダメでした。

補足

他にもモジュールがあります

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

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

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

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

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

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.37%

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

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

質問する

関連した質問