从Matlab优雅地返回到python

时间:2015-09-16 00:52:32

标签: python

我将python中的Matlab代码称为

matlab_cmd_string = MatlabExePth+ " -nosplash -nodesktop -wait -logfile FileIoReg_MatlabRemoteRun.log -minimize -r "
fname = 'CompareMse '
mat_cmd = matlab_cmd_string +  fname  + ", exit\""

被翻译为

  

'C:\ Program Files \ MATLAB \ R2013b \ bin \ matlab.exe -nosplash -nodesktop   -wait -logfile FileIoReg_MatlabRemoteRun.log -minimize -r CompareMse,退出'

Matlab代码完成其工作,然后使用以下构造打印错误并停止执行:

if(mse> thr)
    error('mse has increased');
end

但是,控件不会返回给python。

我在python中尝试了以下命令:

msg=subprocess.check_output(mat_cmd,stderr=subprocess.STDOUT,shell=False)

msg显示为空,控制台窗口不显示任何内容,因为控件未返回。与以下方法相同:

proc = subprocess.Popen(mat_cmd , stdout=subprocess.PIPE, shell=True)
out, err = proc.communicate()
output = out.upper()
proc.returncode      

如果我在matlab中写下以下内容,

if(mse> thr)
    warning('mse has increased');
    return
end

我通过以下方式控制回python:

 msg=subprocess.check_output(mat_cmd,stderr=subprocess.STDOUT,shell=False)
 proc = subprocess.Popen(mat_cmd , stdout=subprocess.PIPE, shell=True)
  out, err = proc.communicate()
    output = out.upper()
    proc.returncode  

msg,out 显示为“”错误 proc.returncode 0

需要的是Matlab中的功能:

for i=1:3
 % Some code here
 if(mse> thr)
       [print error,return user defined exit code and error message back to python variable]
 if (mse_new >mse_old)
       [print warning,do not return, but capture warning back to
        Python variable]
 % some code here

警告的难点在于,如果警告的条件发生在循环迭代1中,而不是第二次和第三次,Python应该能够理解Matlab代码没有错误,只有一个警告,应该捕获它。(并且matlab不应该在for循环的迭代1处退出但是完成所有迭代)

任何想法?
sedy

1 个答案:

答案 0 :(得分:1)

尝试使用import subprocess msg = subprocess.check_output([MatlabExePth, "-nosplash", "-wait", "-logfile", "FileIoReg_MatlabRemoteRun.log", "-minimize", "-r", fname, ", exit"]) print msg 。您可以捕获任何给定命令的输出。检查tutorial

中的Python 2.7子流程文档
.animate()