After playing with Alex's implementation, and adding some support for exceptions, this is what I came up with. I hope I am not getting too clever for my needs:
import os, cPickle def run_in_separate_process_2(f, *args, **kwds): pread, pwrite = os.pipe() pid = os.fork() if pid > 0: os.close(pwrite) with os.fdopen(pread, 'rb') as f: status, result = cPickle.load(f) os.waitpid(pid, 0) if status == 0: return result else: raise result else: os.close(pread) try: result = f(*args, **kwds) status = 0 except Exception, exc: result = exc status = 1 with os.fdopen(pwrite, 'wb') as f: try: cPickle.dump((status,result), f, cPickle.HIGHEST_PROTOCOL) except cPickle.PicklingError, exc: cPickle.dump((2,exc), f, cPickle.HIGHEST_PROTOCOL) f.close() os._exit(0) Basically, the function is called in the child process, and a status code is returned in addition to the result. The status is 0 if the function returns normally, 1 if it raises an exception, and 2 if the result is unpicklable. Some cases are deliberately not handled, like a SystemExit or a KeyboardInterrupt show up as EOF errors in the unpickling in the parent. Some cases are inadvertently not handled, these are called bugs. And the original exception trace is lost. Any comments? Regards, Muhammad Alkarouri -- http://mail.python.org/mailman/listinfo/python-list