51 lines
1.3 KiB
Python
51 lines
1.3 KiB
Python
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'}
|
|
|