在MATLAB中嵌入Python

31

我正在尝试将Python 2.6嵌入到MATLAB(7.12)中。我想使用用C编写的mex文件进行嵌入。对于使用标量的小简单示例,这很好运行。但是,如果以任何方式导入Numpy(1.6.1),MATLAB都会崩溃。我说任何方式是因为我已经尝试过许多方法来加载numpy库,包括:

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

from numpy import *
  • 使用mex文件中的PyRun_SimpleString函数:

  • PyRun_SimpleString(“from numpy import *”);
    
  • 使用PyObject_CallObject调用numpy函数:

  • pOut  = PyObject_CallObject(pFunc, pArgs); 
    
    起初,我认为这可能是将Numpy嵌入C的问题。但是,当使用Visual Studios 2005 C编译器的/MD(多线程)开关从命令行编译简单的C文件时,Numpy可以正常工作。接下来,我想只需更改MATLAB中的make文件以包括/MD开关即可。然而,没有这样的运气,mexopts.bat使用/MD开关编译。我还手动注释了Numpy init模块中的行,以查找导致MATLAB崩溃的原因。似乎加载任何具有pyd扩展名的文件都会导致MATLAB崩溃。NumPy中第一个加载的此类文件是multiarray.pyd。 MATLAB文档描述了如何使用Visual Studios调试mex文件,我也这样做了,并在下面放置了错误消息。现在我知道问题是pyd的内存问题和与MATLAB的某些冲突。有趣的是,我可以在MATLAB中使用系统命令启动一个使用numpy的python进程,而不会生成错误。我将在下面粘贴来自MATLAB的错误消息,后面是在崩溃MATLAB进程的visual studios的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
    

    1
    这可能不是一件容易解决的事情。可能的原因是加载了多个C运行库时出现了冲突(一个为Python,一个为Matlab,可能是Numpy的另一个)。第一个建议:您说任何.pyd文件都会崩溃。您尝试过不来自Numpy的文件吗?第一步是让这个基本部分正常工作,然后再尝试使Numpy(更复杂)正常工作。 (如果解决这个问题太麻烦,计划B将是在单独的进程中运行Python,并使用某种IPC方法与Matlab通信。) - pv.
    1
    我认为避免嵌入是更好的选择。几年前,我编写了一个在Matlab中嵌入Python的MEX文件,并使一切正常运行(尽管这是在Unix上,可以搜索“pythoncall”)。那里还存在加载二进制Python模块(.pyd/.so)的问题,但是通过一些工作,这些问题可以得到解决。然而,它在下一个Matlab版本中无法正常工作---总体而言,感觉像是一个相当脆弱的设置。 - pv.
    2
    好的,看起来现在星象顺利,http://github.com/pv/pythoncall 模块又可以使用了。无论如何,你可以在那里看到这个 hack,我想类似的东西可能也需要在 Windows 上实现。 - pv.
    3
    请参见从MATLAB调用Python函数 - Cees Timmerman
    有点晚了,但我认为@pv关于冲突的CRT版本是正确的。Python 2.6 Windows二进制文件是使用VS2008编译的。无论如何,我已经测试过这段代码(不得不注释掉一些Linux特定的行),对我来说完美地工作了(WinXP 32位,MATLAB R2012a,VS2010,Python2.6)... - Amro
    显示剩余2条评论
    2个回答

    3
    尝试从Python角度解决问题:Python是一种非常好的粘合语言,我建议您使用Python来运行Matlab和C程序。Python有以下特点:
    1. Numpy
    2. PyLab
    3. Matplotlib
    4. IPython
    因此,这些组合几乎可以替代任何现有的Matlab模块。

    3
    尽管措辞得体,但这是最误导、无用和冒犯人的回应。冒犯因为它给"发帖人"留下了忽视此事的可能性。无用是因为它忽略了 John Carmack 所说的 "跨平台问题、专有工具链、认证门槛、许可技术以及对遗留代码库和劳动力可用性的严格性能要求",而这些问题很可能是"发帖人"正在面临的。而且也是误导的,因为你想去帮助TA(但实际上并没有)。 - Ahmed Fasih

    0

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接