A couple of things occur to me on looking at your code:
1. You have not if __name__ == "__main__": in your file - this is a great pattern to follow. 2. You would probably be better off using the multiprocessing library rather than subprocess When you code: self.process = subprocess.Popen([sys.executable, "-u", "testsubprocess.py"], shell=True, stdout=subprocess.PIPE, stdin=subprocess.PIPE, stderr=subprocess.STDOUT) is executed directly as python simpleGUI.py then sys.executable will be /path/to/python.exe but when you execute your simpleGUI.exe then it will be simpleGUI.exe this is why you get a new instance! Hope that helps! Steve From: pyinstaller@googlegroups.com <pyinstaller@googlegroups.com> On Behalf Of Matthew Lawrence Sent: 22 June 2021 17:54 To: PyInstaller <pyinstaller@googlegroups.com> Subject: [PyInstaller] subprocess not working after onefile pyinstaller even with stdout/stdin defined Hi - I posted this question to Stack Overflow (https://stackoverflow.com/questions/68042440/subprocess-not-working-after-onefile-pyinstaller-even-with-stdout-stdin-defined), but haven't had a response, so thought I'd try here. Apologies if this is not the right forum. I have a tkinter GUI with a text box and run button. Pressing the run button turns it to yellow and starts a subroutine that prints a few numbers. Text output from the subroutine is redirected to the GUI text box. However, after creating a standalone executable file with pyinstaller, it no longer works. Pressing the run button doesn't seem to start the subprocess. It does turn yellow, but no text appears in the text box and it seems to start another instance of the main program - a second GUI appears after about 10 seconds which is how long it takes for the initial GUI to appear. The run button stays yellow on the initial GUI. I've seen a bit online about other people having issues with subprocesses not running after pyinstaller, but most of the solutions seem to be to make sure stdout, stdin are set to subprocess.PIPE which I have, so I'm at a bit of a loss what to try next. When running the resulting executable from Anaconda prompt, I also get no error messages or anything useful to help debug. I'm creating my standalone with this: pyinstaller --onefile --add-data "testsubprocess.py;." simpleGUI.py I've also tried without --add-data "testsubprocess.py;.", making sure my executable and testsubprocess.py are in the same folder. My subprocess file, testsubprocess.py is: import time for i in range(3): print("%d.%d" % divmod(i, 10)) time.sleep(0.5) My main GUI file, simpleGUI.py, is: import sys import subprocess from threading import Thread import tkinter as tk from queue import Queue, Empty def iter_except(function, exception): try: while True: yield function() except exception: return class DisplaySubprocessOutputDemo: def __init__(self, root): self.root = root width=600 height=350 xloc=0 yloc=10 self.root.geometry('%dx%d+%d+%d' % (width, height, xloc, yloc)) self.statustext = tk.Text(self.root, height=4, width=30) self.statustext.grid(row=3, column=1) self.startbutton = tk.Button(self.root, text = 'Start', command=self.startprocess, bg='green', activebackground = 'orange') self.startbutton.config(height = 2, width = 15) self.startbutton.grid(row = 5, column=0,sticky='E') self.startbuttonpresses = 0 exitbutton = tk.Button(self.root, text = 'Exit', command=self.quit, bg='red') exitbutton.config(height = 2, width = 15) exitbutton.grid(row = 5, column=4, sticky='E') def startprocess(self): self.startbuttonpresses = self.startbuttonpresses+1 if self.startbuttonpresses == 1: self.startbutton.configure(bg='yellow') self.startbutton.configure(text='Stop') self.process = subprocess.Popen([sys.executable, "-u", "testsubprocess.py"], shell=True, stdout=subprocess.PIPE, stdin=subprocess.PIPE, stderr=subprocess.STDOUT) q = Queue(maxsize=1024) t = Thread(target=self.reader_thread, args=[q]) t.daemon = True t.start() self.updatetext(q) else: self.startbuttonpresses = 0 self.process.kill() self.startbutton.configure(bg='green') self.startbutton.configure(text='Start') def reader_thread(self, q): try: with self.process.stdout as pipe: for line in iter(pipe.readline, b''): q.put(line) finally: q.put(None) def updatetext(self, q): for line in iter_except(q.get_nowait, Empty): # display all content if line is None: self.startbuttonpresses = 0 self.startbutton.configure(bg='green') self.startbutton.configure(text='Start') return else: self.statustext.insert(tk.END, line) self.root.after(400, self.updatetext, q) def quit(self): try: self.process.kill() except Exception: pass self.root.destroy() root = tk.Tk() app = DisplaySubprocessOutputDemo(root) root.protocol("WM_DELETE_WINDOW", app.quit) root.eval('tk::PlaceWindow %s center' % root.winfo_pathname(root.winfo_id())) root.mainloop() -- You received this message because you are subscribed to the Google Groups "PyInstaller" group. To unsubscribe from this group and stop receiving emails from it, send an email to pyinstaller+unsubscr...@googlegroups.com<mailto:pyinstaller+unsubscr...@googlegroups.com>. To view this discussion on the web visit https://groups.google.com/d/msgid/pyinstaller/127a328b-e2c9-4d08-8a71-f574b0c18420n%40googlegroups.com<https://emea01.safelinks.protection.outlook.com/?url=https%3A%2F%2Fgroups.google.com%2Fd%2Fmsgid%2Fpyinstaller%2F127a328b-e2c9-4d08-8a71-f574b0c18420n%2540googlegroups.com%3Futm_medium%3Demail%26utm_source%3Dfooter&data=04%7C01%7C%7C08e0fa1774c0498fddcd08d935c00f0f%7C84df9e7fe9f640afb435aaaaaaaaaaaa%7C1%7C0%7C637599921260094389%7CUnknown%7CTWFpbGZsb3d8eyJWIjoiMC4wLjAwMDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0%3D%7C1000&sdata=Jbo9jd%2BiqD1JsTMih5OrxdsF7ZejMazTRj0Tx%2Bsp244%3D&reserved=0>. -- You received this message because you are subscribed to the Google Groups "PyInstaller" group. To unsubscribe from this group and stop receiving emails from it, send an email to pyinstaller+unsubscr...@googlegroups.com. To view this discussion on the web visit https://groups.google.com/d/msgid/pyinstaller/VI1PR03MB65759B711BDBEEA687014E4B9B089%40VI1PR03MB6575.eurprd03.prod.outlook.com.