2017-10-16 14 views
-2

J'ai un fichier problem.m qui a une fonction comme celle-ci: myfun(p,m).Comment appeler une fonction d'octave à partir de python?

Il effectue un calcul et renvoie le résultat. Pour tester l'exécution de cette fonction, j'ai un fichier test.m qui ressemble à ceci.
myfun(myarg1,myarg2)

Si je lance ce fichier comme: octave test.m Ensuite, il me renvoie le résultat correct qui ressemble à ceci: 0,38007

Maintenant, le problème est lorsque vous appelez cette fonction myfun (p, m) à l'aide python. J'ai essayé d'utiliser la bibliothèque de python: oct2py

Le code python ressemble à ceci:

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]) 

Quand je lance ce code comme: python FileName.py arg1 arg2 (mêmes arguments i utilisés dans test.m), il me donne un message d'avertissement et une liste vide comme ceci:

avertissement: certains éléments dans la liste des valeurs de retour ne sont pas définies []

Je ne sais pas quoi faire à ce sujet. Comme la fonction semble renvoyer un résultat correct dans un format correct lors de l'utilisation d'octave. mais pour une raison quelconque, oct2py ne fonctionne pas.

+0

Votre fonction Octave renvoie-t-elle réellement une sortie ou l'imprime-t-elle simplement dans la fenêtre de commande? S'il vous plaît voir [mcve]. – excaza

+0

ma fonction d'octave retourne une sortie, comme je peux voir ans en octave-cli comme ceci: octave: 1> mytest timeBSeuCallUI = 2.6464e-04 1.5133e + 00 NaN relerrBSeuCallUI = 2.7459e -05 6.2769e-05 NaN ans = 2.6464e-04 octave: 2> ans ans = 2.6464e-04 – STZ

+0

arguments du système sont toujours des chaînes. Si vous avez besoin d'entrées entières, vous devez les analyser en entier –

Répondre

0

Code Octave:

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  

code 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]) 

Le problème dans le code d'octave comme lors de la vérification du problème, il dit problème == 1, mais python attend une chaîne si la liste undefined warning sans valeur résultante. Changer le code d'octave du problème == 1 au problème == "1" résout le problème.