pyinstallerでexe化したプログラムが別のPCで動作しない
exe化したプログラムは、メインPCで作成後、問題なく動作していましたが、環境を構築していないサブPCで動作させてみようとUSBで導入したところ正常に動作しませんでした。
現状の動作状態
- pythonの環境があるメインPCでは、VSCodeで正常に動作し、exe化したものもexeファイルから正常に実行できる。もちろん、exeを含むフォルダーがUSB上にあっても問題なく動作する。
- pythonの環境がないサブPCでも、Tkinterによるwindow内の現在時刻の表示は正常であり、画面を消すボタンも問題なく動作する。また、LIST.pklが存在しない場合は、正常に作成される。LIST.pklの読み込みも正常に行えている(と推定される)。
- サブPCで発生する問題は、実行のボタンをクリックしても実行されないこと。
exe化した際の手順
- MAIN_WINDOW.py、program.py、RECTIFIER.pyの3つのファイルのあるフォルダ内で、右クリックをして出てきた「windows ターミナルで開く」を左クリックして、”pyinstaller MAIN_WINDOW.py --onefile --noconsole”を実行。
- ”pycache”、”build”、”dist”の3つのフォルダーと、"MAIN_WINDOW.spec"が作成され、MAIN_WINDOW.py、program.py、RECTIFIER.pyとあわせて4つのファイルがある状態になります。
- このまま、”dist”フォルダー内にできた”MAIN_WINDOW.exe”を実行しても正常に動かない(Tkinterによるwindow内の現在時刻の表示や「画面を消す」ボタンは問題なく動作するが「実行」のボタンをクリックしても実行されない)ので、MAIN_WINDOW.py、program.py、RECTIFIER.pyの3つのファイルを”dist”フォルダー内に移動させています。LIST.pklは”dist”フォルダー内に作成されます。
- これでメインPCでは正常に動作するようになります。が、サブPCでは先述のとおり正常に動作しませんでした。
以下にコードを記します。
MAIN_WINDOW.py
1import tkinter 2import subprocess 3import pickle 4import datetime 5import os 6 7 8if os.path.exists('LIST.pkl')==False: 9 LIST=["","0"] 10 with open("LIST.pkl","wb") as f: 11 pickle.dump(LIST, f) 12else: 13 pass 14 15 16def show_time(win,Ttext): 17 NOW=datetime.datetime.today() 18 Ttext.set('現在時刻:'+str(NOW.year)+"/"+str(NOW.month)+"/"+str(NOW.day)+"-"+str(NOW.hour)+":"+str(NOW.minute)+":"+str(NOW.second)) 19 win.after(5, lambda : show_time(win, Ttext)) 20 21 22def show_LIST(win,LOGtext): 23 try: 24 with open('LIST.pkl','rb') as f: 25 LIST= pickle.load(f) 26 if LIST[1]=="0": 27 LOGtext.set("実行してください") 28 elif LIST[1]=="1": 29 LOGtext.set('実行しています。') 30 elif LIST[1]=="2": 31 LOGtext.set('終了しました') 32 elif LIST[1]=="3": 33 LOGtext.set('最終実行日時:'+LIST[0]) 34 elif LIST[1]=="4": 35 LOGtext.set('受け付けました。少々お待ちください。') 36 else: 37 LOGtext.set('LISTの読み込みに失敗しました。') 38 except: 39 LOGtext.set('情報の読み込みでエラーが発生しました。') 40 41 win.after(100, lambda : show_LIST(win, LOGtext)) 42 43 44def main(): 45 46 win = tkinter.Tk() 47 win.title("WINDOWとLOGDATA.Vol.4") 48 win.geometry("500x250") 49 50 def F(): 51 subprocess.Popen(["python", "program.py"], shell=True) 52 53 Button = tkinter.Button(win, text='実行') 54 Button["command"]=F 55 Button.pack() 56 57 Ttext = tkinter.StringVar() 58 TIME=tkinter.Label(win, textvariable=Ttext) 59 TIME.pack() 60 TIME.after(5,lambda :show_time(win,Ttext)) 61 62 TEXT=tkinter.StringVar() 63 LOGA=tkinter.Label(win, textvariable=TEXT) 64 LOGA.pack() 65 LOGA.after(5,lambda :show_LIST(win,TEXT)) 66 67 def QUITE(): 68 win.quit() 69 Button = tkinter.Button(win, text='画面を閉じる') 70 Button["command"]=QUITE 71 Button.pack() 72 73 win.mainloop() 74 75main() 76
program.py
1import subprocess 2import time 3 4import random 5 6subprocess.Popen(['python','RECTIFIER.py',"4"],shell=True) 7 8time.sleep(random.randint(10, 15)) #準備中 #簡略のためコードを時間に変えてあります。 9 10subprocess.Popen(['python','RECTIFIER.py',"1"],shell=True) 11 12time.sleep(random.randint(10, 15)) #実行中 #簡略のためコードを時間に変えてあります。 13 14subprocess.Popen(['python','RECTIFIER.py',"2"],shell=True) 15time.sleep(1) 16subprocess.Popen(['python','RECTIFIER.py',"3"],shell=True)
RECTIFIER.py
1import sys 2import datetime 3import pickle 4 5Z = str(sys.argv[1]) 6NOW = datetime.datetime.today() 7TIME = str(NOW.year)+"/"+str(NOW.month)+"/"+str(NOW.day)+"-"+str(NOW.hour)+":"+str(NOW.minute)+":"+str(NOW.second) 8with open('LIST.pkl','rb') as f: 9 LIST = pickle.load(f) 10 11LIST[0] = TIME 12LIST[1] = Z 13 14with open("LIST.pkl","wb") as f: 15 pickle.dump(LIST, f)
コードだけをみると実行ステータスの取得のように思われるかもしれませんが、実際にはprogram.pyのコードが実行されない点で、困っています。
subprocessを使っていないコードのexe化はうまくいっていたのですが、今回のコードを環境がない別のPCでも使えるようなexeの作り方がわかりません。
教えていただけるとありがたいです。どうかよろしくお願いします。
回答2件
あなたの回答
tips
プレビュー