예제 #1
0
    def async_run_code(self, code_obj, result=None, async_=False):
        """A monkey-patched replacement for the InteractiveShell.run_code method.
        It runs the in a separate thread and calls QApplication.processEvents
        periodically until the method finishes.

        :param code_obj : code object
          A compiled code object, to be executed
        :param result : ExecutionResult, optional
          An object to store exceptions that occur during execution.
        :param async_ : Bool (Experimental))
           Attempt to run top-level asynchronous code in a default loop.

        :returns: An AsyncTaskResult object
        """
        # Different target arguments depending on IPython's version
        function_parameters = getfullargspec(orig_run_code)
        if 'result' in function_parameters.args:
            if hasattr(function_parameters, 'kwonlyargs'
                       ) and 'async_' in function_parameters.kwonlyargs:
                return orig_run_code(
                    code_obj, result,
                    async_=async_)  # return coroutine to be awaited
            else:
                task = BlockingAsyncTaskWithCallback(
                    target=orig_run_code,
                    args=(code_obj, result),
                    blocking_cb=QApplication.processEvents)
        else:
            task = BlockingAsyncTaskWithCallback(
                target=orig_run_code,
                args=(code_obj, ),
                blocking_cb=QApplication.processEvents)
        return task.start()
def our_run_code(self, code_obj, result=None, async_=False):
    """ Method with which we replace the run_code method of IPython's InteractiveShell class.
        It calls the original method (renamed to ipython_run_code) on a separate thread
        so that we can avoid locking up the whole of MantidPlot while a command runs.

        Parameters
        ----------
        code_obj : code object
          A compiled code object, to be executed
        result : ExecutionResult, optional
          An object to store exceptions that occur during execution.
        async_ : Bool (Experimental))
           Attempt to run top-level asynchronous code in a default loop.
        Returns
        -------
        False : Always, as it doesn't seem to matter.
    """
    # Different target arguments depending on IPython's version
    function_parameters = getfullargspec(self.ipython_run_code)
    if 'result' in function_parameters.args:
        if hasattr(function_parameters, 'kwonlyargs') and 'async_' in function_parameters.kwonlyargs:
            return self.ipython_run_code(code_obj, result, async_=async_)  # return coroutine to be awaited
        else:
            t = threading.Thread(target=self.ipython_run_code, args=(code_obj, result))
    else:
        t = threading.Thread(target=self.ipython_run_code, args=(code_obj,))
    t.start()
    while t.is_alive():
        QtGui.QApplication.processEvents()
    # We don't capture the return value of the ipython_run_code method but as far as I can tell
    #   it doesn't make any difference what's returned
    return 0
예제 #3
0
 def async_run_code(self, code_obj, result=None):
     """A monkey-patched replacement for the InteractiveShell.run_code method.
     It runs the in a separate thread and calls QApplication.processEvents
     periodically until the method finishes
     """
     # ipython 3.0 introduces a third argument named result
     if len(getfullargspec(orig_run_code).args) == 3:
         args = (code_obj, result)
     else:
         args = (code_obj, )
     task = BlockingAsyncTaskWithCallback(
         target=orig_run_code,
         args=args,
         blocking_cb=QApplication.processEvents)
     return task.start()