前回の波カッコの問題は標準出力をデコードすることで解決しました。
実行前、distディレクトリ内に関連する旧ファイルがあれば手動で削除しておく必要があります(コードでは権限を変えても削除できませんでした)。
これでとりあえず完成でしょうか。
ただし、このコード自身をexe化してもうまく動作しないです。他のコードに対しては正常にexe化できます。カレントディレクトリを変更したりするのが良くないのかもしれません。
<関連箇所のみ>
def exe_make(path):
# ソースコードの作業ディレクトリへのコピー
working_dir = '/test_app/'
new_path = working_dir + (path.split('test_GUI/'))[1]
print(f'new_path {new_path}')
shutil.copy2(path, new_path)
# buildディレクトリ内関連ディレクトリの削除
filename = (path.split('test_GUI/'))[1][:-3]
remove_dir = '/test_app/build/' + filename + '/'
try:
shutil.rmtree(remove_dir)
except:
pass
# 作業ディレクトリ内specファイルの削除
all_files2 = [path for path in glob.glob('/test_app/*.spec')]
remove_files2 = [path for path in all_files2 if filename in path]
print(remove_files2)
if len(remove_files2) != 0:
for path in remove_files2:
os.remove(path)
# カレントディレクトリを作業ディレクトリへ変更
os.chdir('/test_app/')
# exeファイル作成コマンド実行
def run(cmd):
proc = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
while True:
line = proc.stdout.readline()
if line:
yield line
if not line and proc.poll() is not None:
break
cmd = f"pyinstaller {new_path} --onefile --noconsole"
lines = []
for line in run(cmd):
sys.stdout.buffer.write(line)
lines.append(line.decode('utf-8'))
lines_con = ''.join(lines)
list_text()[0].insert(tk.END,'exeファイル作成完了\n')
return lines_con
# Button設定
btn = ttk.Button(frame, text="実行",command=lambda:[list_text()[0].insert(tk.END,exe_make(entry.get())),auto_scroll()],width=8,style= 'MyWidget.TButton')
btn.grid(row=0,column=2,sticky=tk.W,padx=10)