Search code examples
pythontkinterprocesssubprocesswait

How check if a process has finished but without waiting?


I'm doing a small project in python/tkinter and I have been looking for a way to check if a process has finished but "without waiting". I have tried with:

process = subprocess.Popen(command)
while process.poll() is None:
    print('Running!')
print('Finished!')

or:

process = subprocess.Popen(command)
stdoutdata, stderrdata = process.communicate()
print('Finished!')

Both codes execute the command and print "Finished!" when the process ends, but the main program freezes (waiting) and that's what I want to avoid. I need the GUI to stay functional while the process is running and then run some code right after it finishes. Any help?


Solution

  • It's common that you use the Thread module for that purpose:

    For example:

    # import Thread
    from threading import Thread
    import time
    
    # create a function that checks if the process has finished
    process = True
    def check():
        while process:
            print('Running')
            time.sleep(1) # here you can wait as much as you want without freezing the program
        else:
            print('Finished')
    
    # call the function with the use of Thread
    Thread(target=check).start()
    # or if you want to keep a reference to it
    t = Thread(target=check)
    # you might also want to set thread daemon to True so as the Thread ends when the program closes
    t.deamon = True
    t.start()
    

    This way when you do process=False the program will end and the output will show 'Finished'