2017-04-13 6 views
5

J'utilise Oct2Py pour utiliser des fichiers M dans mon code Python. Disons que j'ai cette fonction simple Matlab:Oct2Py ne renvoie que le premier argument de sortie

function [a, b] = toto(c); 
    a = c; 
    b = c + 1; 
end 

Que se passe si je l'appelle Octave est évidemment:

>> [x,y] = toto(3) 
x = 3 
y = 4 

Maintenant, si je l'appelle en Python, en utilisant oct2py:

from oct2py import octave 
my_dir = "D:\\My_Dir" 
octave.addpath(my_dir) 
a,b = octave.toto(3) 

Ce rendement:

TypeError: 'int' object is not iterable

Il semble que octave.toto (n) ne renvoie que la première valeur, quand je m'attendrais à deux ... Quelqu'un peut-il m'expliquer ce que je devrais faire? Merci

Répondre

5

Dans les anciennes versions de Oct2Py (3.x et plus), le nombre d'arguments de sortie a été déduit de l'appel au sein de Python, donc si vous vouliez plusieurs sorties, vous demanderiez simplement les deux sorties

a, b = octave.toto(3) 

Cependant, as of version 4.0 vous devez maintenant utiliser le nout kwarg à votre appel de fonction pour spécifier explicitement le nombre souhaité d'arguments de sortie

a, b = octave.toto(3, nout=2) 

de la version 4.0 Notes de version

Removed inferred nout for Octave function calls; it must be explicitly given if not 1. The old behavior was too surprising and relied on internal logic of the CPython interpreter.

+0

Je comprends la différence! Cependant, cette ligne renvoie: TypeError: l'objet 'int' n'est pas itérable. Exactement comme si j'avais écrit: [a, b] = octave.test (3) ... On dirait vraiment octave.test (n) donne une seule sortie ... – Telergoel

+0

@Telergoel Ca devrait vraiment marcher. Pouvez-vous changer votre nom de fonction pour quelque chose qui n'est pas en conflit avec une fonction de base de la bibliothèque? Aussi, s'il vous plaît montrer le code exact que vous essayez d'utiliser – Suever

+0

J'ai changé le nom de ma fonction, il n'y a plus de conflit mais toujours le TypeError. Je peux partager mes lignes de code exactes si nécessaire mais je suis vraiment en train de tester avec les simples ci-dessus et ça ne marche vraiment pas. – Telergoel