如何通过subprocess.Popen执行Matlab例程时将值从Matlab返回到Python

时间:2015-09-17 00:54:54

标签: python matlab

我可以使用Python调用并将参数传递给Matlab,如下所示:

    MatlabExePth=checkMatlabExe()
    matlab_cmd_string = MatlabExePth+ " -nosplash -nodesktop -wait -r "
    changeDirectory("C:\\SVN\\Matlabcode")
    mat_cmd = matlab_cmd_string + "\"" + 'testMatlabReturnToPython' +  ", exit\""
    # test return value Method 1
    msg=subprocess.check_output(mat_cmd,stderr=subprocess.STDOUT,shell=True)
    # test return value method 2
     proc = subprocess.Popen(cmd_string, stdout=subprocess.PIPE, shell=True)
     out, err = proc.communicate()

testMatlabReturnToPython.m代码如下所示:

    function [err,err_cod] = testMatlabReturnToPython()
      try

        mse=0.01;
        thr=0.1;
        if(mse>thr)
            err = 'no error'
            err_cod = 0;
        else
            % cause an exception
            [1 2]*[1 2];
        end
     catch
         err = ' error'
         err_cod = -1;
     end

与Python代码一样,我需要一种方法将错误 err_code 变量返回到Python(这些可能是数组,单元格等),但我没有找到办法。

注意:在调用Matlab支持后,发现import matlab.engine将执行上述操作,但可以从matlab R2014b 获得,而我有 R2013b

1 个答案:

答案 0 :(得分:1)

try-catch以下的小例如何?

function [my_out, status] = myfun(my_inputs)
  try
    do_your_work_here;
    my_out = your_result;
    status = 1;
  catch ME
    my_out = [];
    status = -1;
    warning(ME.getReport());
  end
end

更新:关于你的更新问题,要从python中的matlab函数获取值,你可能需要在python中使用类似的东西:

import matlab.engine as ME
PE = ME.start_matlab()
err,err_cod = PE.testMatlabReturnToPython(nargout=2)
抱歉,我现在没有python,所以无法确认它是否完美运行。