Sto cercando di incorporare Python 2.6 in MATLAB (7.12). Volevo incorporare un file mex scritto in C. Questo ha funzionato bene per piccoli esempi semplici usando scalari. Tuttavia, se Numpy (1.6.1) viene importato in alcuni arresti anomali di MATLAB. Dico comunque perché ho provato un certo numero di modi per caricare le librerie NumPy compresiIncorporamento Python in MATLAB
Nel modulo python (.py):
from numpy import *
Con
PyRun_SimpleString
nel file mex:PyRun_SimpleString(“from numpy import *”);
Richiamo funzioni NumPy con
Py_oBject_CallObject
:pOut = PyObject_CallObject(pFunc, pArgs);
In origine, ho pensato che questo potrebbe essere un problema con l'incorporamento Numpy in C. Tuttavia, Numpy funziona bene quando incorporato in semplici file C che vengono compilati dalla riga di comando con interruttore/MD (multithread) con il Visual Compilatore di Studios 2005 C. Successivamente, ho pensato di cambiare il file make in MATLAB per includere l'opzione/MD. Nessuna fortuna, mexopts.bat si compila con l'opzione/MD. Ho anche commentato manualmente le righe nel modulo init di Numpy per trovare quello che stava bloccando MATLAB. Sembra che il caricamento di qualsiasi file con l'estensione pyd blocchi MATLAB. Il primo di questi file caricati in NumPy è multiarray.pyd. La documentazione di MATLAB descrive come eseguire il debug dei file mex con gli studi visivi che ho fatto e ho inserito il messaggio di errore qui sotto. A questo punto, so che il problema è un problema di memoria con pyd e qualche conflitto con MATLAB. È interessante notare che posso utilizzare un comando di sistema in MATLAB per avviare un processo in python che utilizza numpy e non viene generato alcun errore. Incollerò sotto il messaggio di errore di MATLAB seguito dall'output DEBUG in studi visivi dei processi che bloccano MATLAB. Tuttavia, non sto incollando il tutto perché l'elenco delle eccezioni di first-chance è molto lungo. Ci sono suggerimenti per risolvere questo problema di integrazione?
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.
uscita da Visual Studio 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
Questo probabilmente non sarà facile da rintracciare. Un possibile motivo è il conflitto con il caricamento di più librerie di runtime C (una per Python, una per Matlab e probabilmente un'altra per Numpy). Primo suggerimento: tu dici che qualsiasi file .pyd si blocca. Hai provato quelli non da Numpy? Il primo passo sarebbe quello di far funzionare questa parte di base, e solo dopo quella mossa di provare a rendere Numpy (che è più complicato) funzionare.(Se risolvere questo è troppo lavoro, il piano B sarebbe quello di eseguire Python in un processo separato e utilizzare un metodo IPC per comunicare con Matlab.) –
Buon punto. La prima opzione, come hai menzionato, è seguire il thread .pyd a terra. Tuttavia, ciò potrebbe implicare l'esame e, eventualmente, la riscrittura dei file pyd compilati in C. Prende una riga di codice per salvare un file .mat in MATLAB (salva "data", "variable", "-v7") (deve essere salvato nel formato precedente per compatibilità con Python) e una riga di codice per leggerlo in Python (variabile = loadmat ('data.mat')) con il pacchetto Scipy (da scipy.io import loadmat). Inoltre, sembra esserci più scritto sull'avvolgimento delle funzioni MATLAB in Python, che è quello che proverò. –
Direi che evitare l'incorporamento è la soluzione migliore. Alcuni anni fa ho scritto un file MEX che incorpora Python all'interno di Matlab e ha funzionato. (Questo era su Unix, però, google "pythoncall".) C'erano problemi con il caricamento dei moduli Python binari (.pyd/.so) anche lì, ma con un po 'di lavoro quelli potrebbero essere risolti. Tuttavia, non ha funzionato con la prossima versione di Matlab --- nel complesso, sembrava una configurazione piuttosto fragile. –