在MATLAB中嵌入Python

31 投票
2 回答
3932 浏览
提问于 2025-04-17 04:34

我正在尝试把Python 2.6嵌入到MATLAB(7.12)中。我想用一个用C语言写的mex文件来实现这个嵌入。对于一些简单的小例子,使用标量时这个方法运行得很好。但是,一旦我以任何方式导入了Numpy(1.6.1),MATLAB就会崩溃。我说“任何方式”是因为我尝试了多种加载Numpy库的方法,包括:

  1. 在Python模块(.py)中:

    from numpy import *
    
  2. 在mex文件中使用PyRun_SimpleString

    PyRun_SimpleString(“from numpy import *”);
    
  3. Py_oBject_CallObject调用Numpy函数:

    pOut  = PyObject_CallObject(pFunc, pArgs); 
    

起初,我以为这可能是嵌入Numpy到C中的问题。然而,当我在简单的C文件中嵌入Numpy,并使用Visual Studios 2005 C编译器通过命令行编译时,Numpy运行得很好,使用了/MD(多线程)选项。接下来,我想我可以在MATLAB的make文件中加入/MD选项,但没有成功,mexopts.bat编译时已经使用了/MD选项。我还手动注释掉了Numpy初始化模块中的一些行,以找出导致MATLAB崩溃的原因。看起来加载任何扩展名为pyd的文件都会导致MATLAB崩溃。在Numpy中,第一个加载的这样的文件是multiarray.pyd。MATLAB的文档中描述了如何用Visual Studios调试mex文件,我也这样做了,并把错误信息放在下面。此时我知道问题出在pyd文件的内存问题,以及与MATLAB之间的某种冲突。有趣的是,我可以在MATLAB中使用系统命令启动一个使用Numpy的Python进程,而不会产生错误。接下来,我会把MATLAB的错误信息和Visual Studios中导致MATLAB崩溃的进程的DEBUG输出粘贴在下面。不过,我不会粘贴完整的内容,因为第一次出现的异常列表非常长。有没有什么建议可以解决这个集成问题呢?

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. 

来自Visual Studios调试器的输出

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

2 个回答

0

在2014b版本的Matlab中,新增了一个功能,可以直接在m代码中调用Python函数

3

试着从Python的角度来看这个问题:Python是一种很棒的“胶水”语言,我建议你用Python来运行你的Matlab和C程序。Python有以下这些工具:

  1. Numpy:用于处理数组和数学计算的库
  2. PyLab:一个方便的工具,可以让你更容易地绘图和做数据分析
  3. Matplotlib:用于绘制各种图表的库
  4. IPython:一个增强版的Python交互环境,让你更方便地写代码和测试

所以,这些工具的组合几乎可以替代任何现有的Matlab模块。

撰写回答