from - matlab api for python
Llamar a la funciĆ³n Python desde MATLAB (13)
A partir de Matlab 2014b, las funciones de Python se pueden invocar directamente. Use el prefijo py, luego el nombre del módulo, y finalmente el nombre de la función, así:
result = py.module_name.function_name(parameter1);
Asegúrese de agregar la secuencia de comandos a la ruta de búsqueda de Python cuando llame desde Matlab si se encuentra en un directorio de trabajo diferente al de la secuencia de comandos de Python.
Ver más detalles en un video que publiqué.
Necesito llamar a una función de Python de MATLAB. ¿Cómo puedo hacer esto?
Como dijo @dgorissen, Jython es la solución más fácil.
Simplemente instale Jython desde la homepage .
Entonces:
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'');
Vea la documentación para algunos ejemplos.
Cuidado: nunca trabajé con Jython y parece que la biblioteca estándar que se puede conocer de CPython no está completamente implementada en Jython.
Los pequeños ejemplos que probé funcionaron bien, pero es posible que deba preceder el directorio de código de Python a sys.path
.
Como dijo Daniel, puedes ejecutar comandos de Python directamente desde Matlab usando py. mando. Para ejecutar cualquiera de las bibliotecas, solo tiene que asegurarse de que Malab ejecuta el entorno python donde instaló las bibliotecas:
En una Mac:
Abra una nueva ventana de terminal;
type: which python (para saber dónde está instalada la versión predeterminada de python);
Reiniciar Matlab;
- tipo: pyversion (''/ anaconda2 / bin / python''), en la línea de comando (obviamente reemplace con su ruta).
- Ahora puede ejecutar todas las bibliotecas en su instalación predeterminada de python.
Por ejemplo:
py.sys.version;
py.sklearn.cluster.dbscan
Con Matlab 2014b, las bibliotecas de Python se pueden llamar directamente desde matlab . Un prefijo py.
se agrega a todos los nombres de paquetes:
wrapped = py.textwrap.wrap(T); % calls textwrap.wrap in python
Este parece ser un método adecuado para "tunelizar" funciones de Python a MATLAB :
http://code.google.com/p/python-matlab-wormholes/
La gran ventaja es que puede manejar ndarrays con él, lo cual no es posible con la salida estándar de los programas, como se sugirió anteriormente. (Por favor corrígeme, si crees que esto está mal, me ahorraría muchos problemas :-))
He adaptado el perl.m
a python.m
y lo python.m
adjuntado como referencia para otros, pero parece que no puedo obtener ningún resultado de los scripts de Python para devolverlo a la variable MATLAB :(
Aquí está mi archivo M; nota que C:/python27_64
directamente a la carpeta de Python, C:/python27_64
, en mi código, y esto cambiaría en tu sistema.
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
EDITAR:
Resuelto mi problema, el perl.m original apunta a una instalación de Perl en la carpeta MATLAB actualizando PATH y luego llamando a Perl. La función anterior apunta a mi instalación de Python. Cuando llamé a mi archivo function.py
, estaba en un directorio diferente y llamé a otros archivos en ese directorio. Estos no se reflejaron en PATH , y tuve que instalar easy_ mis archivos de Python en mi distribución de Python.
La forma más sencilla de hacerlo es usar la función de system MATLAB .
Entonces, básicamente, ejecutarías una función de Python en MATLAB como lo harías en el símbolo del sistema (Windows) o shell (Linux):
system(''python pythonfile.py'')
Lo anterior es solo para ejecutar un archivo Python. Si quisiera ejecutar una función de Python (y darle algunos argumentos), entonces necesitaría algo como:
system(''python pythonfile.py argument'')
Para un ejemplo concreto, tome el código de Python en la respuesta de Adrian a esta pregunta, y guárdelo en un archivo de Python, es decir, test.py
A continuación, coloque este archivo en su directorio MATLAB y ejecute el siguiente comando en MATLAB:
system(''python test.py 2'')
Y obtendrás como salida 4 o 2 ^ 2.
Nota: MATLAB busca en el directorio actual de MATLAB cualquier archivo Python que especifique con el comando del system
.
Esta es probablemente la forma más simple de resolver su problema, ya que simplemente usa una función existente en MATLAB para hacer su oferta.
Podría incrustar su script Python en un programa C y luego MEX el programa C con MATLAB, pero eso podría ser mucho trabajo comparado con arrojar los resultados a un archivo.
Puede llamar a las funciones de MATLAB en Python usando PyMat . Además de eso, SciPy tiene varias funciones duplicadas de MATLAB.
Pero si necesita ejecutar scripts de Python desde MATLAB, puede intentar ejecutar los comandos del system para ejecutar el script y almacenar los resultados en un archivo y leerlo más tarde en MATLAB.
Pruebe este archivo MEX para llamar realmente a Python desde MATLAB, no al revés, como sugieren otros. Proporciona una integración bastante decente: algoholic.eu/matpy
Puedes hacer algo como esto fácilmente:
[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);
Tenía un requisito similar en mi sistema y esta era mi solución:
En MATLAB hay una función llamada perl.m, que le permite invocar scripts de Perl desde MATLAB. Dependiendo de la versión que esté usando, se ubicará en algún lugar como
C:/Program Files/MATLAB/R2008a/toolbox/matlab/general/perl.m
Cree una copia llamada python.m, una búsqueda rápida y el reemplazo de perl con python, compruebe dos veces la ruta del comando que configura para apuntar a su instalación de python. Ahora debería poder ejecutar scripts de Python desde MATLAB.
Ejemplo
Una función cuadrada simple en python guardada como "sqd.py", naturalmente, si estuviera haciendo esto correctamente, tendría algunos controles en los argumentos de entrada de prueba, números válidos, 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)))
Entonces en MATLAB
>> r=python(''sqd.py'',''3.5'')
r =
12.25
>> r=python(''sqd.py'',''5'')
r =
25.0
>>
Un hecho poco conocido (y poco documented ) sobre la función system()
MATLAB : en sistemas unixoid, utiliza el intérprete que se da en la variable de entorno SHELL
o MATLAB_SHELL
en el momento de iniciar MATLAB. Entonces, si comienzas MATLAB con
SHELL=''/usr/bin/python'' matlab
cualquier llamada subsiguiente al system()
utilizará Python lugar de su shell predeterminado como intérprete.