73 votes

Appeler une fonction Python depuis MATLAB

Je dois appeler une fonction Python à partir de MATLAB. Comment puis-je le faire ?

2 votes

MATLAB prend-il en charge les sockets ?

1 votes

Apparemment, il a le support des douilles code.google.com/p/msocket si cela peut aider

0 votes

Si nous ajoutons des options : github.com/kw/pymex

47voto

Adrian Points 2037

J'avais une exigence similaire sur mon système et c'était ma solution :

Dans MATLAB, il existe une fonction appelée perl.m, qui vous permet d'appeler des scripts perl à partir de MATLAB. En fonction de la version que vous utilisez, cette fonction se trouve quelque part comme suit

C:\Program Files\MATLAB\R2008a\toolbox\matlab\general\perl.m

Créez une copie appelée python.m, une recherche rapide et le remplacement de perl par python, vérifiez le chemin de commande qu'il configure pour pointer vers votre installation de python. Vous devriez maintenant être en mesure d'exécuter des scripts python à partir de MATLAB.

Exemple

Une simple fonction d'élévation au carré en python enregistrée sous le nom de "sqd.py", naturellement, si je faisais cela correctement, j'aurais quelques vérifications pour tester les arguments d'entrée, les nombres valides, etc.

import sys

def squared(x):
    y = x * x
    return y

if __name__ == '__main__':
    x = float(sys.argv[1])
    sys.stdout.write(str(squared(x)))

Ensuite, dans MATLAB

>> r=python('sqd.py','3.5')
r =
12.25
>> r=python('sqd.py','5')
r =
25.0
>>

2 votes

perl fait juste un appel système pour exécuter le script Perl - il n'y a pas de transfert de données entre le script Perl et MATLAB à part "les résultats de la tentative d'appel Perl à result et son statut de sortie à status". - mathworks.com/access/helpdesk/help/techdoc/ref/perl.html

0 votes

Je suis d'accord pour dire qu'il s'agit juste d'un appel système mais pourquoi compliquer les choses avec les fonctions mex et les sockets si ce n'est pas nécessaire ? A un niveau simple, l'appel à python a un simple transfert de données. Je vais mettre à jour la réponse avec un exemple.

6 votes

+1 - Le code de l'exemple MATLAB semble excellent - pouvez-vous poster (code/lien) python.m ? Quelles sont les limites des données retournées - uniquement scalaires ?

19voto

algoholic Points 141

Essayez ce fichier MEX pour appeler VRAIMENT Python depuis MATLAB et non l'inverse comme d'autres le suggèrent. Il fournit une intégration assez décente : http://algoholic.eu/matpy/

Vous pouvez faire quelque chose comme ça facilement :

[X,Y]=meshgrid(-10:0.1:10,-10:0.1:10);
Z=sin(X)+cos(Y);
py_export('X','Y','Z')
stmt = sprintf(['import matplotlib\n' ...
'matplotlib.use(''Qt4Agg'')\n' ...
'import matplotlib.pyplot as plt\n' ...
'from mpl_toolkits.mplot3d import axes3d\n' ...
'f=plt.figure()\n' ...
'ax=f.gca(projection=''3d'')\n' ...
'cset=ax.plot_surface(X,Y,Z)\n' ...
'ax.clabel(cset,fontsize=9,inline=1)\n' ...
'plt.show()']);
py('eval', stmt);

1 votes

+1 merci pour cette excellente solution. Veuillez envisager d'héberger le projet sur GitHub, afin que d'autres puissent également le trouver.

2 votes

Pour ceux qui sont intéressés, je viens de trouver deux autres projets similaires : appel pythique y pymex (je ne les ai pas encore essayés moi-même)

14voto

Jacob Points 22306

Vous pourriez intégrer votre script Python dans un programme C et ensuite MEX le programme C avec MATLAB mais cela pourrait représenter beaucoup de travail par rapport à l'envoi des résultats dans un fichier.

Vous pouvez appeler des fonctions MATLAB en Python à l'aide des éléments suivants PyMat . En dehors de cela, SciPy possède plusieurs fonctions dupliquées de MATLAB.

Mais si vous avez besoin d'exécuter des scripts Python à partir de MATLAB, vous pouvez essayer d'exécuter la commande suivante système pour exécuter le script et stocker les résultats dans un fichier pour le lire plus tard dans MATLAB.

11voto

Kay Points 8052

Comme l'a dit @dgorissen, Jython est la solution la plus simple.

Il suffit d'installer Jython à partir du site page d'accueil .

Ensuite :

javaaddpath('/path-to-your-jython-installation/jython.jar')

import org.python.util.PythonInterpreter;

python = PythonInterpreter; %# takes a long time to load!
python.exec('import some_module');
python.exec('result = some_module.run_something()');
result = python.get('result');

Voir la documentation pour quelques exemples.

Attention : je n'ai jamais travaillé avec Jython et il semble que la bibliothèque standard que l'on connaît de CPython n'est pas complètement implémentée dans Jython !

Les petits exemples que j'ai testés ont fonctionné sans problème, mais il se peut que vous deviez faire précéder votre répertoire de code Python de la mention sys.path .

2 votes

Il est définitivement plus facile à intégrer. Dommage qu'à ce jour, on ne puisse pas utiliser des modules comme Numpy/Scipy/matplotlib avec Jython (à cause des extensions C). Ces bibliothèques sont vraiment le point fort de Python en ce qui concerne le calcul scientifique.

0 votes

Il est difficile de répondre à la question. On pourrait simplement ouvrir Python (à partir de Matlab) et écrire/lire à partir du shell REPL, également. Je suppose qu'une intégration transparente ne sera possible qu'avec Jython. Par contre, en utilisant ctypes, il pourrait être facile d'intégrer Octave, mais pas Matlab, dans CPython.

0 votes

(Accordé, Octave est un remplacement chétif de Matlab).

10voto

kyphos Points 180

La façon la plus simple de procéder est d'utiliser la fonction MATLAB 's système fonction.

En gros, vous exécutez une fonction Python sur MATLAB comme vous le feriez sur l'invite de commande (Windows) ou le shell (Linux) :

system('python pythonfile.py')

Ce qui précède est pour simplement exécuter un fichier Python. Si vous vouliez exécuter une fonction Python (et lui donner des arguments), vous auriez besoin de quelque chose comme :

system('python pythonfile.py argument')

Pour un exemple concret, prenez le code Python dans la réponse d'Adrian à cette question, et enregistrez-le dans un fichier Python, c'est-à-dire test.py . Placez ensuite ce fichier dans votre répertoire MATLAB et exécutez la commande suivante sur MATLAB :

system('python test.py 2')

Et vous obtiendrez comme résultat 4 ou 2^2.

Remarque : MATLAB recherche dans le répertoire MATLAB actuel le fichier Python que vous spécifiez avec la commande system commandement.

Il s'agit probablement de la façon la plus simple de résoudre votre problème, car vous utilisez simplement une fonction existante dans MATLAB pour faire votre travail.

0 votes

C'est ce que j'avais fait, mais je me heurte à un mystérieux problème : l'un des arguments de mon script python est un fichier. Lorsqu'il est appelé à partir de MATLAB, le script python ne trouve pas le fichier (bien que tous les scripts se trouvent dans le même répertoire que le fichier et que le chemin complet soit spécifié dans le script MATLAB). C'est exaspérant.

0 votes

Les suggestions semblent excellentes, mais je reçois le message d'erreur "'python' n'est pas reconnu comme une commande interne ou externe, un programme exploitable ou un fichier batch. "

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X