2011-10-18 13 views
31

Estoy tratando de incrustar Python 2.6 en MATLAB (7.12). Quería incrustar con un archivo mex escrito en C. Esto funcionó bien para pequeños ejemplos simples usando escalares. Sin embargo, si Numpy (1.6.1) se importa de todos modos, MATLAB se bloquea. Yo digo de todos modos porque he intentado varias formas de cargar las bibliotecas numpy incluyendoIncrustar Python en MATLAB

  1. En el módulo de Python (.py):

    from numpy import * 
    
  2. Con PyRun_SimpleString en el archivo Mex:

    PyRun_SimpleString(“from numpy import *”); 
    
  3. Llamando funciones numpy con Py_oBject_CallObject:

    pOut = PyObject_CallObject(pFunc, pArgs); 
    

Originalmente, pensé que esto puede ser un problema con la incorporación de Numpy en C. Sin embargo, Numpy funciona bien cuando está incrustada en los archivos simples C que se compilan desde la línea de comandos con el interruptor/MD (multihilo) con el Visual Compilador de Studios 2005 C Luego, pensé que simplemente cambiaría el archivo Make en MATLAB para incluir el modificador/MD. No hay tanta suerte, mexopts.bat compila con el modificador/MD. También comenté manualmente las líneas en el módulo de inicio de Numpy para encontrar lo que estaba fallando MATLAB. Parece que cargar cualquier archivo con la extensión pyd bloquea MATLAB. El primero de dichos archivos cargados en NumPy es multiarray.pyd. La documentación de MATLAB describe cómo depurar archivos mex con estudios visuales, lo cual hice y coloqué el mensaje de error a continuación. En este momento, sé que el problema es un problema de memoria con los pyd y algunos conflictos con MATLAB. Curiosamente, puedo usar un comando del sistema en MATLAB para iniciar un proceso en Python que usa numpy y no se genera ningún error. Pegaré debajo del mensaje de error de MATLAB seguido de la salida DEBUG en estudios visuales de los procesos que bloquean MATLAB. Sin embargo, no estoy pegando todo porque la lista de excepciones de primera oportunidad es muy larga. ¿Hay alguna sugerencia para resolver este problema de integración?

MATLAB error 
Matlab has encountered an internal problem and needs to close 
MATLAB crash file:C:\Users\pml355\AppData\Local\Temp\matlab_crash_dump.3484-1: 


------------------------------------------------------------------------ 
     Segmentation violation detected at Tue Oct 18 12:19:03 2011 
------------------------------------------------------------------------ 

Configuration: 
    Crash Decoding : Disabled 
    Default Encoding: windows-1252 
    MATLAB License : 163857 
    MATLAB Root  : C:\Program Files\MATLAB\R2011a 
    MATLAB Version : 7.12.0.635 (R2011a) 
    Operating System: Microsoft Windows 7 
    Processor ID : x86 Family 6 Model 7 Stepping 10, GenuineIntel 
    Virtual Machine : Java 1.6.0_17-b04 with Sun Microsystems Inc. Java HotSpot(TM) Client VM mixed mode 
    Window System : Version 6.1 (Build 7600) 

Fault Count: 1 

Abnormal termination: 
Segmentation violation 

Register State (from fault): 
    EAX = 00000001 EBX = 69c38c20 
    ECX = 00000001 EDX = 24ae1da8 
    ESP = 0088af0c EBP = 0088af44 
    ESI = 69c38c20 EDI = 24ae1da0 

    EIP = 69b93d31 EFL = 00010202 

    CS = 0000001b DS = 00000023 SS = 00000023 
    ES = 00000023 FS = 0000003b GS = 00000000 


Stack Trace (from fault): 
[ 0] 0x69b93d31 C:/Python26/Lib/site-packages/numpy/core/multiarray.pyd+00081201 (???+000000) 
[ 1] 0x69bfead4 C:/Python26/Lib/site-packages/numpy/core/multiarray.pyd+00518868 (???+000000) 
[ 2] 0x69c08039 C:/Python26/Lib/site-packages/numpy/core/multiarray.pyd+00557113 (???+000000) 
[ 3] 0x08692b09       C:/Python26/python26.dll+00076553 (PyEval_EvalFrameEx+007833) 
[ 4] 0x08690adf       C:/Python26/python26.dll+00068319 (PyEval_EvalCodeEx+002255) 



This error was detected while a MEX-file was running. If the MEX-file 
is not an official MathWorks function, please examine its source code 
for errors. Please consult the External Interfaces Guide for information 
on debugging MEX-files. 

If this problem is reproducible, please submit a Service Request via: 
    http://www.mathworks.com/support/contact_us/ 

A technical support engineer might contact you with further information. 

Thank you for your help. 

salida desde Visual Estudios DEBUGGER

First-chance exception at 0x0c12c128 in MATLAB.exe: 0xC0000005: Access violation reading location 0x00000004. 
First-chance exception at 0x0c12c128 in MATLAB.exe: 0xC0000005: Access violation reading location 0x00000004. 
First-chance exception at 0x0c12c128 in MATLAB.exe: 0xC0000005: Access violation reading location 0x00000004. 
First-chance exception at 0x751d9673 in MATLAB.exe: Microsoft C++ exception: jitCgFailedException at memory location 0x00c3e210.. 
First-chance exception at 0x751d9673 in MATLAB.exe: Microsoft C++ exception: jitCgFailedException at memory location 0x00c3e400.. 
First-chance exception at 0x69b93d31 in MATLAB.exe: 0xC0000005: Access violation writing location 0x00000001. 
> throw_segv_longjmp_seh_filter() 
throw_segv_longjmp_seh_filter(): invoking THROW_SEGV_LONGJMP SEH filter 
> mnUnhandledWindowsExceptionFilter() 
MATLAB.exe has triggered a breakpoint 
+1

Esto probablemente no sea fácil de rastrear. Una posible razón es algún conflicto con la carga de múltiples bibliotecas de tiempo de ejecución de C (una para Python, una para Matlab y posiblemente una diferente para Numpy). Primera sugerencia: dices que cualquier archivo .pyd falla. ¿Probaste alguno que no sea de Numpy? El primer paso sería hacer funcionar esta parte básica, y solo después de eso pasar a tratar de hacer que Numpy (que es más complicado) funcione.(Si resolver esto es demasiado trabajo, el plan B sería ejecutar Python en un proceso separado, y usar algún método de IPC para comunicarse con Matlab). –

+0

Buen punto. La primera opción como mencionas es seguir el hilo .pyd a tierra. Sin embargo, eso puede implicar examinar y posiblemente reescribir los archivos pyd compilados en C. Se necesita una línea de código para guardar un archivo .mat en MATLAB (guardar 'datos', 'variable', '-v7') (se debe guardar en formato anterior para compatibilidad con Python) y una línea de código para leerlo en Python (variable = loadmat ('data.mat')) con el paquete Scipy (desde scipy.io import loadmat). Además, parece que hay más escrito sobre el ajuste de las funciones de MATLAB en Python, que es lo que intentaré. –

+1

Yo diría que evitar la incrustación es la mejor opción. Hace algunos años escribí un archivo MEX que incrusta Python dentro de Matlab y conseguí que todo funcionara. (Sin embargo, esto fue en Unix, google "pythoncall".) Hubo problemas con la carga de módulos binarios de Python (.pyd/.so) también allí, pero con algunos trabajos podrían resolverse. Sin embargo, no funcionó con la próxima versión de Matlab, en general, parecía una configuración bastante frágil. –

Respuesta

5

Trata de abordar el problema desde el lado Python: Python es un gran lenguaje de pegamento, lo que sugeriría que tener Python ejecutar su Matlab y C programas. Python tiene:

  1. Numpy
  2. PyLab
  3. Matplotlib
  4. IPython

Por lo tanto, la combinación es una buena alternativa para casi cualquier módulo de Matlab existente.

+2

Aunque civilmente, este es el tipo más desacertado, inútil e insultante de respuesta. Insulta porque asigna una probabilidad distinta de cero a la posibilidad de que op no piense en esto. Inútil porque ignora los "problemas de plataforma cruzada, cadenas de herramientas propietarias, puertas de certificación, tecnologías bajo licencia y estrictos requisitos de rendimiento además de los problemas con las bases de datos heredadas y la disponibilidad de mano de obra" (John Carmack) que probablemente enfrentará. Y equivocado porque quiere ayudar (pero simplemente no). –

Cuestiones relacionadas