実現したいこと
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で確認して何度も修正しましたが、ダメでした。
補足
他にもモジュールがあります
あなたの回答
tips
プレビュー