Python subprocess: callback when cmd exits

callback, exit, python, subprocess

Solution

You're right - there is no nice API for this. You're also right on your second point - it's trivially easy to design a function that does this for you using threading.

import threading
import subprocess

def popen_and_call(on_exit, popen_args):
    """
    Runs the given args in a subprocess.Popen, and then calls the function
    on_exit when the subprocess completes.
    on_exit is a callable object, and popen_args is a list/tuple of args that 
    would give to subprocess.Popen.
    """
    def run_in_thread(on_exit, popen_args):
        proc = subprocess.Popen(*popen_args)
        proc.wait()
        on_exit()
        return
    thread = threading.Thread(target=run_in_thread, args=(on_exit, popen_args))
    thread.start()
    # returns immediately after the thread starts
    return thread

Even threading is pretty easy in Python, but note that if on_exit() is computationally expensive, you'll want to put this in a separate process instead using multiprocessing (so that the GIL doesn't slow your program down). It's actually very simple - you can basically just replace all calls to `threading.Thread` with `multiprocessing.Process` since they follow (almost) the same API.

Problem

I'm currently launching a programme using `subprocess.Popen(cmd, shell=TRUE)` I'm fairly new to Python, but it 'feels' like there ought to be some api that lets me do something similar to: ``` subprocess.Popen(cmd, shell=TRUE, postexec_fn=function_to_call_on_exit) ``` I am doing this so that `function_to_call_on_exit` can do something based on knowing that the cmd has exited (for example keeping count of the number of external processes currently running) I assume that I could fairly trivially wrap subprocess in a class that combined threading with the `Popen.wait()` method, but as I've not done threading in Python yet and it seems like this might be common enough for an API to exist, I thought I'd try and find one first. Thanks in advance :)

Original source

Related problems