in nubia/internal/helpers.py [0:0]
def run_process(process_arg_list, on_interrupt=None, working_dir=None):
"""
This runs a process using subprocess python module but handles SIGINT
properly. In case we received SIGINT (Ctrl+C) we will send a SIGTERM to
terminate the subprocess and call the supplied callback.
@param process_arg_list Is the list you would send to subprocess.Popen()
@param on_interrupt Is a python callable that will be called in case we
received SIGINT
This may raise OSError if the command doesn't exist.
@return the return code of this process after completion
"""
assert isinstance(process_arg_list, list)
old_handler = signal.getsignal(signal.SIGINT)
process = subprocess.Popen(process_arg_list, cwd=working_dir)
def handler(signum, frame):
process.send_signal(signal.SIGTERM)
# call the interrupted callack
if on_interrupt:
on_interrupt()
# register the signal handler
signal.signal(signal.SIGINT, handler)
rv = process.wait()
# after the process terminates, restore the original SIGINT handler
# whatever it was.
signal.signal(signal.SIGINT, old_handler)
return rv