def octave_command(*args, **kwargs): """ Octave command """ kwargs['nout'] = kwargs.get('nout', get_nout()) kwargs['verbose'] = kwargs.get('verbose', False) if not 'Built-in Function' in doc: self.eval('clear {0}'.format(name), log=False, verbose=False) return self._call(name, *args, **kwargs)
def _call(self, func, *inputs, **kwargs): """ Oct2Py Parameters -------------------------- inputs : array_like Variables to pass to the function. verbose : bool, optional Log Octave output at INFO level. If False, log at DEBUG level. nout : int, optional Number of output arguments. This is set automatically based on the number of return values requested. You can override this behavior by passing a different value. timeout : float, optional Time to wait for response from Octave (per character). plot_dir: str, optional If specificed, save the session's plot figures to the plot directory instead of displaying the plot window. plot_name : str, optional Saved plots will start with `plot_name` and end with "_%%.xxx' where %% is the plot number and xxx is the `plot_format`. plot_format: str, optional The format in which to save the plot. plot_width: int, optional The plot with in pixels. plot_height: int, optional The plot height in pixels. kwargs : dictionary, optional Key - value pairs to be passed as prop - value inputs to the function. The values must be strings or numbers. Returns ----------- out : value Value returned by the function. Raises ---------- Oct2PyError If the function call is unsucessful. Notes ----- Integer type arguments will be converted to floating point unless `convert_to_float=False`. """ nout = kwargs.pop('nout', get_nout()) argout_list = ['_'] # these three lines will form the commands sent to Octave # load("-v6", "infile", "invar1", ...) # [a, b, c] = foo(A, B, C) # save("-v6", "out_file", "outvar1", ...) load_line = call_line = save_line = '' prop_vals = [] eval_kwargs = {} for (key, value) in kwargs.items(): if key in ['verbose', 'timeout'] or key.startswith('plot_'): eval_kwargs[key] = value continue if isinstance(value, (str, unicode, int, float)): prop_vals.append('"%s", %s' % (key, repr(value))) else: msg = 'Keyword arguments must be a string or number: ' msg += '%s = %s' % (key, value) raise Oct2PyError(msg) prop_vals = ', '.join(prop_vals) try: temp_dir = tempfile.mkdtemp(dir=self.temp_dir) self._reader.create_file(temp_dir) if nout: # create a dummy list of var names ("a", "b", "c", ...) # use ascii char codes so we can increment argout_list, save_line = self._reader.setup(nout) call_line = '[{0}] = '.format(', '.join(argout_list)) call_line += func + '(' if inputs: argin_list, load_line = self._writer.create_file( temp_dir, inputs) call_line += ', '.join(argin_list) if prop_vals: if inputs: call_line += ', ' call_line += prop_vals call_line += ');' # create the command and execute in octave cmd = [load_line, call_line, save_line] data = self.eval(cmd, temp_dir=temp_dir, **eval_kwargs) finally: try: shutil.rmtree(temp_dir) except OSError: pass if isinstance(data, dict) and not isinstance(data, Struct): data = [data.get(v, None) for v in argout_list] if len(data) == 1 and data.values()[0] is None: data = None return data
def octave_command(*args, **kwargs): """ Octave command """ kwargs['nout'] = kwargs.get('nout', get_nout()) kwargs['verbose'] = kwargs.get('verbose', False) return self._call(name, *args, **kwargs)