J'ai besoin d'appeler une fonction Python de MATLAB. Comment faire?
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. Selon la version que vous utilisez, elle sera située quelque part comme
C:\Program Files\MATLAB\R2008a\toolbox\matlab\general\Perl.m
Créez une copie appelée python.m, une recherche rapide et remplacez Perl par python, revérifiez le chemin de commande qu'il configure pour pointer vers votre installation de python. Vous devriez maintenant pouvoir exécuter les scripts python de MATLAB.
Exemple
Une fonction quadratique simple en python enregistré en tant que "sqd.py", naturellement si je le faisais 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 __== '__main__':
x = float(sys.argv[1])
sys.stdout.write(str(squared(x)))
Puis dans MATLAB
>> r=python('sqd.py','3.5')
r =
12.25
>> r=python('sqd.py','5')
r =
25.0
>>
Avec Matlab 2014b python peuvent être appelées directement depuis matlab . Un préfixe py.
est ajouté à tous les noms de paquets:
wrapped = py.textwrap.wrap(T); % calls textwrap.wrap in python
Essayez ce fichier MEX pour appeler ACTUELLEMENT Python de MATLAB pas l'inverse comme d'autres le suggèrent. Il fournit une intégration assez décente: http://algoholic.eu/matpy/ =
Vous pouvez facilement faire quelque chose comme ça:
[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);
Vous pourriez intégrer votre Python dans un programme C puis MEX le programme C avec MATLAB mais cela pourrait être beaucoup de travail par rapport vider les résultats dans un fichier.
Vous pouvez appeler les fonctions MATLAB dans Python en utilisant PyMat . En dehors de cela, SciPy possède plusieurs fonctions MATLAB en double.
Mais si vous devez exécuter les scripts Python de MATLAB, vous pouvez essayer d'exécuter les commandes system pour exécuter le script et stocker les résultats dans un fichier et les lire plus tard dans MATLAB .
Comme l'a dit @dgorissen, Jython est la solution la plus simple.
Installez simplement Jython depuis la 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 réellement travaillé avec Jython et il semble que la bibliothèque standard que l'on peut connaître de CPython n'est pas complètement implémentée en Jython!
Les petits exemples que j'ai testés ont très bien fonctionné, mais vous pouvez constater que vous devez ajouter votre répertoire de code Python à sys.path
.
La façon la plus simple de le faire est d'utiliser la fonction MATLAB système .
Donc, fondamentalement, vous exécuteriez une fonction Python sur MATLAB comme vous le feriez sur l'invite de commande (Windows) ou Shell (Linux):
system('python pythonfile.py')
Ce qui précède est pour exécuter simplement un fichier Python. Si vous vouliez exécuter une fonction Python (et lui donner quelques arguments), alors 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 sortie 4 ou 2 ^ 2.
Remarque: MATLAB recherche dans le répertoire MATLAB actuel le fichier Python que vous spécifiez avec la commande system
).
C'est probablement le moyen le plus simple de résoudre votre problème, car vous utilisez simplement une fonction existante dans MATLAB pour faire votre offre.
J'ai adapté le Perl.m
À python.m
Et l'ai attaché pour référence pour les autres, mais je n'arrive pas à obtenir de sortie des scripts Python à renvoyer au MATLAB variable :(
Voici mon fichier M; note Je pointe directement vers le dossier Python, C:\python27_64
, dans mon code, et cela changerait sur votre système.
function [result status] = python(varargin)
cmdString = '';
for i = 1:nargin
thisArg = varargin{i};
if isempty(thisArg) || ~ischar(thisArg)
error('MATLAB:python:InputsMustBeStrings', 'All input arguments must be valid strings.');
end
if i==1
if exist(thisArg, 'file')==2
if isempty(dir(thisArg))
thisArg = which(thisArg);
end
else
error('MATLAB:python:FileNotFound', 'Unable to find Python file: %s', thisArg);
end
end
if any(thisArg == ' ')
thisArg = ['"', thisArg, '"'];
end
cmdString = [cmdString, ' ', thisArg];
end
errTxtNoPython = 'Unable to find Python executable.';
if isempty(cmdString)
error('MATLAB:python:NoPythonCommand', 'No python command specified');
elseif ispc
pythonCmd = 'C:\python27_64';
cmdString = ['python' cmdString];
pythonCmd = ['set PATH=',pythonCmd, ';%PATH%&' cmdString];
[status, result] = dos(pythonCmd)
else
[status ignore] = unix('which python'); %#ok
if (status == 0)
cmdString = ['python', cmdString];
[status, result] = unix(cmdString);
else
error('MATLAB:python:NoExecutable', errTxtNoPython);
end
end
if nargout < 2 && status~=0
error('MATLAB:python:ExecutionError', ...
'System error: %sCommand executed: %s', result, cmdString);
end
A résolu mon problème, le Perl.m d'origine pointe vers une installation Perl dans le dossier MATLAB en mettant à jour le chemin [~ # ~] [~ # ~] puis appeler Perl. La fonction ci-dessus pointe vers mon installation Python. Lorsque j'ai appelé mon fichier function.py
, Il se trouvait dans un répertoire différent et a appelé d'autres fichiers dans ce répertoire. Celles-ci n'étaient pas reflétées dans le chemin d'accès [~ # ~] [~ # ~] , et j'ai dû installer facilement mes fichiers Python dans mon Distribution Python.
À partir de Matlab 2014b Python peuvent être appelées directement. Utilisez le préfixe py, puis le nom du module, et enfin le nom de la fonction comme ceci:
result = py.module_name.function_name(parameter1);
Assurez-vous d'ajouter le script au chemin de recherche Python lors de l'appel depuis Matlab si vous êtes dans un répertoire de travail différent de celui du script Python.
Voir plus de détails dans un vidéo j'ai posté.
Un fait peu connu (et peu documenté ) sur MATLAB 's system()
function: Sur les systèmes unixoïdes, il utilise n'importe quel interpréteur donné dans la variable d'environnement Shell
ou MATLAB_Shell
au moment du démarrage de MATLAB. Donc, si vous démarrez MATLAB avec
Shell='/usr/bin/python' matlab
tous les appels system()
ultérieurs utiliseront Python au lieu de votre Shell par défaut comme interprète.
Puisque MATLAB s'intègre de manière transparente à Java, vous pouvez utiliser Jython pour écrire votre script et l'appeler depuis MATLAB (vous devrez peut-être ajouter un mince wrapper JKava pur pour appeler réellement le code Jython). Je ne l'ai jamais essayé, mais je ne vois pas pourquoi cela ne fonctionnera pas.
Comme Daniel l'a dit, vous pouvez exécuter les commandes python directement depuis Matlab en utilisant py. commander. Pour exécuter l'une des bibliothèques, il vous suffit de vous assurer que Malab exécute l'environnement python où vous avez installé les bibliothèques:
Sur un Mac:
Ouvrez une nouvelle fenêtre de terminal;
tapez: quel python (pour savoir où la version par défaut de python est installée);
Redémarrez Matlab;
Par exemple:
py.sys.version;
py.sklearn.cluster.dbscan
Cela semble être une méthode appropriée pour "tunneler" les fonctions de Python à MATLAB :
http://code.google.com/p/python-matlab-wormholes/
Le gros avantage est que vous pouvez gérer des ndarrays avec lui, ce qui n'est pas possible par la sortie standard des programmes, comme suggéré précédemment. (Veuillez me corriger, si vous pensez que c'est faux - cela me sauverait beaucoup de problèmes :-))