在 MATLAB 中嵌入 Python

Posted

技术标签:

【中文标题】在 MATLAB 中嵌入 Python【英文标题】:Embedding Python in MATLAB 【发布时间】:2011-12-10 07:34:42 【问题描述】:

我正在尝试将 Python 2.6 嵌入到 MATLAB (7.12) 中。我想嵌入一个用 C 编写的 mex 文件。这对于使用标量的小型简单示例效果很好。但是,如果无论如何导入 Numpy (1.6.1),MATLAB 会崩溃。无论如何,我之所以这么说是因为我尝试了多种方法来加载 numpy 库,包括

    在python模块(.py)中:

    from numpy import *
    

    在 mex 文件中使用PyRun_SimpleString

    PyRun_SimpleString(“from numpy import *”);
    

    Py_oBject_CallObject调用numpy函数:

    pOut  = PyObject_CallObject(pFunc, pArgs); 
    

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

【问题讨论】:

这可能不是一个容易追踪的。一个可能的原因是与加载多个 C 运行时库(一个用于 Python,一个用于 Matlab,可能另一个用于 Numpy)发生冲突。第一个建议:你说任何 .pyd 文件都会崩溃。你试过不是来自 Numpy 的吗?第一步是让这个基本部分工作,然后才开始尝试让 Numpy(更复杂)工作。 (如果解决这个工作量太大,方案 B 是在一个单独的进程中运行 Python,并使用某种 IPC 方法与 Matlab 通信。) 好点。您提到的第一个选项是跟随 .pyd 线程到地面。但是,这可能涉及检查并可能重写 C 编译的 pyd 文件。在 MATLAB 中保存一个 .mat 文件需要一行代码(保存 'data'、'variable'、'-v7')(必须以早期格式保存以与 Python 兼容)和一行代码来读取它带有 Scipy 包的 Python(变量 = loadmat('data.mat'))(来自 scipy.io 导入 loadmat)。此外,似乎还有更多关于在 Python 中包装 MATLAB 函数的文章,这是我将尝试的。 我会说避免嵌入是更好的方法。几年前,我编写了一个将 Python 嵌入到 Matlab 中的 MEX 文件,并且一切正常。 (不过,这是在 Unix 上,谷歌“pythoncall”。)在那里加载二进制 Python 模块(.pyd/.so)也存在问题,但通过一些工作可以解决这些问题。但是,它不适用于下一个 Matlab 版本 --- 总体而言,感觉是一个非常脆弱的设置。 好的,现在看来星星是正确的,github.com/pv/pythoncall 模块又可以工作了。在任何情况下,您都可以在那里看到 hack,我想在 Windows 上可能需要类似的东西。 另见Calling a Python function from MATLAB。 【参考方案1】:

尝试从 Python 方面解决问题:Python 是一种很好的粘合语言,我建议您让 Python 运行您的 Matlab 和 C 程序。 Python有:

    麻木 PyLab Matplotlib IPython

因此,该组合是几乎所有现有 Matlab 模块的良好替代方案。

【讨论】:

虽然委婉地说,这是最误导、最无用和侮辱性的回应。侮辱,因为它将非零概率分配给 op 没有想到这一点的可能性。无用,因为它忽略了 op 可能面临的“跨平台问题、专有工具链、认证门、许可技术和严格的性能要求以及遗留代码库和劳动力可用性问题”(约翰卡马克)。并且被误导了,因为您打算提供帮助(但不要)。【参考方案2】:

在 matlab 2014b 中添加了直接在 m 代码中 call python functions 的可能性。

【讨论】:

以上是关于在 MATLAB 中嵌入 Python的主要内容,如果未能解决你的问题,请参考以下文章

在独立的 Matlab 可执行文件中嵌入全局变量?

在simulink的嵌入式matlab函数中使用scatterInterpolant变量

使用嵌入式matlab功能块的simulink模型中信号的频率内容?

图像隐写基于matlab GUI DCT数字水印嵌入+提取含Matlab源码 1671期

语音隐写基于matlab GUI DWT+SVD音频水印嵌入含Matlab源码 1409期

语音隐写基于matlab GUI DCT音频数字水印嵌入提取含Matlab源码 837期