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 :)