import logging from multiprocessing import Process, Pipe class SubprocessOperatorMixin: timer = None log = logging.getLogger("%s.SubprocessOperatorMixin" % __name__) # run once in invoke def setup(self): pass # run on receipt of data from subprocess def handle_response(self, resp): pass def __init__(self): self.pipe = Pipe() self.subprocess = None def execute(self, context): return self.invoke(context, None) def invoke(self, context, event): self.subprocess.start() # we have to explicitly close the end of the pipe we are NOT using, # otherwise no exception will be generated when the other process closes its end. self.pipe[1].close() wm = context.window_manager wm.modal_handler_add(self) self.timer = wm.event_timer_add(.01, context.window) self.setup() return {'RUNNING_MODAL'} def modal(self, context, event): self.log.debug("polling") try: if self.pipe[0].poll(): newdata = self.pipe[0].recv() else: newdata = None except EOFError: self.log.debug("done polling") return {'FINISHED'} if newdata is not None: self.handle_response(newdata) return {'PASS_THROUGH'}