get data from octave script execution using oct2py

2019-07-27 11:58发布

I'm trying to execute some Matlab scripts (not a function definition) from Python 3 using oct2py module.

Those scripts (a large amount) contains a very extended definition to read a specific ASCIII files (contained in the same directory).

I do not know how to get the data read by Python with the Matlab (octave) scripts.

Here what I am doing:

from oct2py import octave

import numpy as np
import os

import pprint

hom_dir='/path_to/files&scripts_dir/'
os.chdir(hom_dir)

octave.addpath(/path_to/files&scripts_dir/')

out=octave. matlab_file # (matlab_file.m)

output:

Out[237]: <function oct2py.core.Oct2Py._make_octave_command.<locals>.octave_command>”

pprint.pprint(out)

<function Oct2Py._make_octave_command.<locals>.octave_command at 0x7f2069d669d8>”

No error is returned, but I do not know how to get the data (that were read in a Octave session). The examples that I have found for execute .m files using oct2py where about files that define functions, however that is not my case.

1条回答
闹够了就滚
2楼-- · 2019-07-27 12:41

Assuming your script places the results on the (virtual) octave workspace, you can simply attempt to access the workspace.

Example:

%% In file myscript.m
a = 1
b = 2

Python code:

>>> octave.run('myscript.m')
>>> vars = octave.who(); vars
[u'A__', u'a', u'b']
>>> octave.a()
1.0
>>> octave.b()
2.0

Some notes / caveats:

  • I ran into problems when I tried running a script, as it complained I was trying to run it as a function; you can bypass this using the run command.
  • Your octave current directory may not be the same as your python current directory (this depends on how the octave engine is started). For me python started in my home directory but octave started in my desktop directory. I had to manually check and go to the correct directory, i.e.:

    octave.pwd()
    octave.cd('/path/to/my/homedir')
    
  • Those weird looking variables A__ (B__, etc) in the workspace reflect the most recent arguments you passed into functions via the oct2py engine (but for some reason they can't be called like normal variables). E.g.

    >>> octave.plus(1,2)
    3.0
    >>> print octave.who()
    [u'A__', u'B__', u'a', u'b']
    >>> octave.eval('A__')
    A__ =  1
    >>> octave.eval('B__')
    B__ =  2
    
  • As you may have noticed from above, the usual ans variable is not kept in the workspace. Do not rely on any script actions that reference ans. In the context of oct2py it seems that ans will always evaluate to None

查看更多
登录 后发表回答