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

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

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

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

Python

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

Q&A

解決済

2回答

2679閲覧

pythonで書いたコードを別のPCでも使えるexeの作り方がわかりません。

EgyptianMau

総合スコア11

PyInstaller

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

Python

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

0グッド

2クリップ

投稿2022/02/23 13:17

編集2022/02/23 13:20

pyinstallerでexe化したプログラムが別のPCで動作しない

exe化したプログラムは、メインPCで作成後、問題なく動作していましたが、環境を構築していないサブPCで動作させてみようとUSBで導入したところ正常に動作しませんでした

現状の動作状態

  • pythonの環境があるメインPCでは、VSCodeで正常に動作し、exe化したものもexeファイルから正常に実行できる。もちろん、exeを含むフォルダーがUSB上にあっても問題なく動作する。
  • pythonの環境がないサブPCでも、Tkinterによるwindow内の現在時刻の表示は正常であり、画面を消すボタンも問題なく動作する。また、LIST.pklが存在しない場合は、正常に作成される。LIST.pklの読み込みも正常に行えている(と推定される)。
  • サブPCで発生する問題は、実行のボタンをクリックしても実行されないこと。

exe化した際の手順

  1. MAIN_WINDOW.py、program.py、RECTIFIER.pyの3つのファイルのあるフォルダ内で、右クリックをして出てきた「windows ターミナルで開く」を左クリックして、”pyinstaller MAIN_WINDOW.py --onefile --noconsole”を実行。
  2. pycache”、”build”、”dist”の3つのフォルダーと、"MAIN_WINDOW.spec"が作成され、MAIN_WINDOW.py、program.py、RECTIFIER.pyとあわせて4つのファイルがある状態になります。
  3. このまま、”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の作り方がわかりません。
教えていただけるとありがたいです。どうかよろしくお願いします。

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

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

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

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

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

tmp

2022/02/23 23:26

subprocessでpythonを使ってprogram.pyを実行するになっているのをexe化したものを実行するという風にかえてみてはどうでしょうか?
EgyptianMau

2022/02/24 05:49

ご回答ありがとうございます。 そのような発想には至っておりませんでした! 試してみます。
EgyptianMau

2022/02/24 06:21

サブPCでも正常に動くようになりました! どうやら、subprocessでpythonを使ってprogram.pyを実行するのは、pythonが入っていないPCではできない感じなんですかね。pyinstallerが動くようにしてくれるのかなと思ってました。 はじめて質問を投稿したのですが、解決できてうれしいです。ありがとうございました。
guest

回答2

0

そのコードの各所で、ログを出力するなりして、どうして動かないのかの原因を探っていくことです。
それがわかれば、どうやれば正常に動くかわかるようになります(アタリマエのはなし)

投稿2022/02/23 15:17

y_waiwai

総合スコア87747

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

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

EgyptianMau

2022/02/24 05:49

ご回答ありがとうございます。 自分ではあれこれ探ったつもりですが、力不足でした。。。
y_waiwai

2022/02/24 06:32

例えば何かエラーが出たとか、コードのどこまで実行できてどこからは実行されないとか程度の情報はないでしょうか
EgyptianMau

2022/02/24 07:05 編集

>例えば何かエラーが出たとか pythonの環境があるPCではエラーはありませんでした。 環境が構築されていないPCでのみ正常に動作しませんでしたが、ただ動かないだけでした。エラーをWindowに表示するプログラムにしようと思いつかなかったので、エラーの内容はわからないままでした。次似たことがあればやってみようと思います。 >コードのどこまで実行できてどこからは実行されないとか 自分では「現状の動作状態」で伝えれたつもりだったのですが、初めての質問で説明が不十分だったと思います。 初心者過ぎてコードではない部分に問題があるのかもしれないと思ったり、コードのどこがおかしそうだと明記するのは間違っていそうだと思ったりして、避けていました。 結果的には、subprocessの使い方に問題があったようです。 わざわざご返答までしてくださりありがとうございました。
guest

0

自己解決

subprocessでpythonを使ってprogram.pyを実行するのをexe化したものを実行するに変更。
そうすると元のままでは、ボタンをクリックしてから表示に反映されるまでにexeを読み込む時間の分だけ遅れが生じるので、少々変えました。

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 try: 52 subprocess.Popen(["program.exe"], shell=True) 53 import datetime 54 55 NOW = datetime.datetime.today() 56 TIME = str(NOW.year)+"/"+str(NOW.month)+"/"+str(NOW.day)+"-"+str(NOW.hour)+":"+str(NOW.minute)+":"+str(NOW.second) 57 with open('LIST.pkl','rb') as f: 58 LIST = pickle.load(f) 59 60 LIST[0] = TIME 61 LIST[1] = "4" 62 63 with open("LIST.pkl","wb") as f: 64 pickle.dump(LIST, f) 65 66 except: 67 pass 68 69 Button = tkinter.Button(win, text='実行') 70 Button["command"]=F 71 Button.pack() 72 73 Ttext = tkinter.StringVar() 74 TIME=tkinter.Label(win, textvariable=Ttext) 75 TIME.pack() 76 TIME.after(5,lambda :show_time(win,Ttext)) 77 78 TEXT=tkinter.StringVar() 79 LOGA=tkinter.Label(win, textvariable=TEXT) 80 LOGA.pack() 81 LOGA.after(5,lambda :show_LIST(win,TEXT)) 82 83 def QUITE(): 84 win.quit() 85 Button = tkinter.Button(win, text='画面を閉じる') 86 Button["command"]=QUITE 87 Button.pack() 88 89 win.mainloop() 90 91main()

program.py

1import subprocess 2import time 3 4import random 5 6time.sleep(random.randint(10, 15)) #準備中 #簡略のため時間に変えてあります。 7 8subprocess.Popen(['RECTIFIER.exe',"1"],shell=True) 9 10time.sleep(random.randint(10, 15)) #実行中 #簡略のため時間に変えてあります。 11 12subprocess.Popen(['RECTIFIER.exe',"2"],shell=True) 13time.sleep(1) 14subprocess.Popen(['RECTIFIER.exe',"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)

投稿2022/02/24 06:29

EgyptianMau

総合スコア11

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問