Llamar a la función Python desde MATLAB

Necesito llamar a una función Python desde MATLAB. ¿Cómo puedo hacer esto?

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 llamar scripts perl desde MATLAB. Dependiendo de la versión que esté utilizando, 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 y reemplazo rápidos de perl por python, verifique dos veces la ruta de comandos 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 lo estuviera haciendo 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))) 

Luego en MATLAB

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

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 

Pruebe este archivo MEX para REALMENTE llamar a Python desde MATLAB, no al revés, como sugieren otros. Proporciona una integración bastante decente: http://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); 

Podría incrustar su secuencia de comandos de Python en un progtwig de C y luego MEX el progtwig de C con MATLAB, pero podría ser mucho trabajo comparar el volcado de los resultados a un archivo.

Puede llamar a las funciones de MATLAB en Python usando PyMat . Aparte de eso, SciPy tiene varias funciones duplicadas de MATLAB.

Pero si necesita ejecutar scripts de Python desde MATLAB, puede intentar ejecutar comandos del sistema para ejecutar el script y almacenar los resultados en un archivo y leerlos más adelante en MATLAB.

Como dijo @dgorissen, Jython es la solución más fácil.

Solo instala Jython desde la página de inicio .

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 saber de CPython no está completamente implementada en Jython.

Los pequeños ejemplos que probé funcionaron bien, pero es posible que tenga que anteponer su directorio de código Python a sys.path .

La forma más sencilla de hacer esto es usar la función del sistema de MATLAB .

Básicamente, ejecutaría una función de Python en MATLAB como lo haría en el símbolo del sistema (Windows) o shell (Linux):

 system('python pythonfile.py') 

Lo anterior es para simplemente ejecutar un archivo de 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 Python en la respuesta de Adrian a esta pregunta y guárdelo en un archivo Python, que es test.py Luego coloque este archivo en su directorio de 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 el archivo de Python que especifique con el comando del system .

Esta es probablemente la forma más sencilla de resolver su problema, ya que simplemente utiliza una función existente en MATLAB para hacer su oferta.

He adaptado perl.m a python.m y python.m esto como referencia para otros, pero parece que no puedo obtener ningún resultado de los scripts de Python para que se devuelva a la variable MATLAB 🙁

Aquí está mi archivo M; nota C:\python27_64 directamente a la carpeta de Python, C:\python27_64 , en mi código, y esto cambiaría en su 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:

Resolví 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 llamaba a otros archivos en ese directorio. Estos no se reflejaban en el PATH , y tuve que instalar fácilmente mis archivos de Python en mi distribución de Python.

Un hecho poco conocido (y poco documentado ) sobre la función system() MATLAB : en los sistemas unixoid utiliza cualquier intérprete que se proporciona en la variable de entorno SHELL o MATLAB_SHELL en el momento de iniciar MATLAB. Así que si empiezas MATLAB con

 SHELL='/usr/bin/python' matlab 

cualquier llamada subsiguiente de system() usará Python en lugar de su shell predeterminado como intérprete.

Dado que MATLAB se integra a la perfección con Java, puede usar Jython para escribir su script y llamar a eso desde MATLAB (es posible que tenga que agregar un envoltorio JKava puro y delgado para llamar al código Jython). Nunca lo probé, pero no puedo ver por qué no funciona.

A partir de Matlab 2014b, las funciones de Python se pueden llamar 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 el script a la ruta de búsqueda de Python cuando llame desde Matlab si está en un directorio de trabajo diferente al del script de Python.

Ver más detalles en un video que publiqué.

Este parece ser un método adecuado para “hacer un túnel” de las funciones de Python a MATLAB :

http://code.google.com/p/python-matlab-wormholes/

La gran ventaja es que puede manejar ndarrays con ella, lo que no es posible por la salida estándar de los progtwigs, como se sugirió anteriormente. (Por favor, corríjame, si cree que esto está mal, me ahorraría muchos problemas :-))

Como dijo Daniel, puedes ejecutar comandos de python directamente desde Matlab usando el py. mando. Para ejecutar cualquiera de las bibliotecas, solo debe asegurarse de que Malab esté ejecutando el entorno de Python donde instaló las bibliotecas:

En una Mac:

  • Abra una nueva ventana de terminal;

  • escriba: which python (para averiguar dónde está instalada la versión predeterminada de python);

  • Reiniciar Matlab;

  • escribe: pyversion (‘/ anaconda2 / bin / python’), en la línea de comando (obviamente reemplaza con tu ruta).
  • Ahora puede ejecutar todas las bibliotecas en su instalación predeterminada de Python.

Por ejemplo:

py.sys.version;

py.sklearn.cluster.dbscan

Como Python es un lenguaje de pegado mejor, puede ser más fácil llamar la parte MATLAB de su progtwig desde Python en lugar de viceversa.

Echa un vistazo a Mlabwrap .