如何从python调用octave函数?

问题描述:

我有一个有这样的功能的problem.m文件:myfun(p,m)如何从python调用octave函数?

它做了一些计算并返回结果。为了测试这个函数的执行情况,我有一个如下所示的test.m文件。
myfun(myarg1,myarg2)

如果我运行此文件为: octave test.m 然后返回我正确的结果看起来像这样:0.38007

现在的问题是调用使用此功能myfun(P,M)时蟒蛇。我试图用Python库:oct2py

的Python代码如下所示:

import sys 
import subprocess 
import oct2py 
import requests 
from oct2py import octave 

def myfun(p,m): 
    octave.addpath('/mypath'); 
    oc = oct2py.Oct2Py() 
    #res = octave.myfun(p,m nout=1);#this didn't work, hence comment 
    #res = oc.myfun(p, m) #this didn't work, hence comment  
    x = oc.feval("myfun",p,m); 
    print(x); 

if __name__ == '__main__': 
    myfun(sys.argv[1],sys.argv[2]) 

当我运行此代码:蟒蛇FileName.py ARG1 ARG2(相同的论点我test.m使用)它给了我一个警告消息,并且空单是这样的:

警告:在返回值的列表中的一些元素是未定义 []

我不知道该怎么做。由于该功能似乎在使用八度时以正确的格式返回正确的结果。但由于某些原因,oct2py不起作用。

+0

您的Octave函数是否实际返回一个输出,还是仅仅将它打印到命令窗口?请参阅[mcve]。 – excaza

+0

我的八度函数返回一个输出,如我可以看到在ANS倍频-CLI这样的:八度:1> mytest的 timeBSeuCallUI = 2.6464e-04 1.5133e + 00 的NaN relerrBSeuCallUI = 2.7459e -05 6.2769e-05 的NaN ANS = 2.6464e-04 八度:2> ANS ANS = 2.6464e-04 – STZ

+0

系统参数总是字符串。如果你需要整数输入,你应该首先将它们解析为整数 –

倍频代码:

function result = test(problem,method)  
Methods={'MC','COS','RBF-AD','RBF-MLT'};  
if problem == 1  
    S=[90,100,110]; K=100; T=1.0; r=0.03; sig=0.15;  
    U=[2.758443856146076 7.485087593912603 14.702019669720769];  
    rootpath=pwd;  
    filepathsBSeuCallUI=getfilenames('./','BSeuCallUI_*.m');  
    par={S,K,T,r,sig};  
    [timeBSeuCallUI,relerrBSeuCallUI] = 
    executor(rootpath,filepathsBSeuCallUI,U,par)  

    tBSeuCallUI=NaN(numel(Methods),1); rBSeuCallUI=tBSeuCallUI;  
    for ii=1:numel(Methods)  
     for jj=1:numel(filepathsBSeuCallUI)  
      a=filepathsBSeuCallUI{jj}(3:3+numel(Methods{ii}));  
      b=[Methods{ii},'/'];  
      if strcmp(a,b)  
      tBSeuCallUI(ii)=timeBSeuCallUI(jj);  
      rBSeuCallUI(ii)=relerrBSeuCallUI(jj);  
     end  
    end  
end  

cd(rootpath);  
for el=1:numel(Methods)  
    if strcmp((Methods{el}),method)  
     result = tBSeuCallUI(el); 
    end 
end  
end  

Python代码:

import sys  
import subprocess  
import oct2py  
import requests  

def benchop(problem,method):  
    oc = oct2py.Oct2Py()  
    res = oc.test(problem,method)  
    return res  

if __name__ == '__main__':  
    benchop(sys.argv[1],sys.argv[2]) 

在八度代码检查问题的时候因为这个问题,它说的问题== 1,但是Python是期待一个字符串,所以列表未定义的警告没有结果值。从问题== 1改变八度码到问题==“1”解决了这个问题。