2011-10-18 179 views
31

我想将Python 2.6嵌入到MATLAB(7.12)中。我想嵌入用C语言编写的mex文件。这对使用标量的简单示例很有用。但是,如果Numpy(1.6.1)被导入无论如何MATLAB崩溃。我说反正因为我已经尝试了多种方式来加载numpy的库,包括在MATLAB中嵌入Python

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

    from numpy import * 
    
  2. 随着在MEX文件PyRun_SimpleString

    PyRun_SimpleString(“from numpy import *”); 
    
  3. 调用numpy的功能与Py_oBject_CallObject

    pOut = PyObject_CallObject(pFunc, pArgs); 
    

本来,我认为这可能与C.然而嵌入numpy的一个问题,嵌入在从与/ MD(多线程)开关的命令行与Visual编译简单的C文件时numpy的正常工作Studios 2005 C编译器。接下来,我想我只是改变MATLAB中的make文件来包含/ MD开关。没有这样的运气,mexopts.bat用/ MD开关编译。我还在Numpy init模块中手动注释了行,以查找什么是崩溃的MATLAB。似乎用扩展名pyd加载任何文件崩溃MATLAB。在NumPy中加载的第一个这样的文件是multiarray.pyd。 MATLAB文档介绍了如何使用可视化工作室调试mex文件,并将错误信息放在下面。在这一点上,我知道这个问题是pyd的一个记忆问题,和一些与MATLAB的冲突。有趣的是,我可以在MATLAB中使用系统命令来启动使用numpy的python中的进程,并且不会生成错误。我将在MATLAB下面贴上错误消息,然后在崩溃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. 

从视觉工作室调试器输出

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进行通信。) –

+0

好点。你提到的第一个选项是在.pyd线程之后。但是,这可能涉及检查并可能重写C编译的pyd文件。它需要一行代码来在MATLAB中保存一个.mat文件(保存'data','variable','-v7')(必须保存为与Python兼容的早期格式)和一行代码来读取它Python(变量= loadmat('data.mat'))与Scipy包(来自scipy.io import loadmat)。此外,似乎有更多关于在Python中封装MATLAB函数的文章,这是我将尝试的。 –

+1

我想说,避免嵌入是更好的过程。几年前,我写了一个MEX文件,将Matlab嵌入到Matlab中,并使所有的工作都能正常工作。 (尽管这是在Unix上,谷歌“pythoncall”)。加载二进制Python模块(.pyd/.so)也存在问题,但有些工作可以解决。然而,它并没有与下一个Matlab版本一起工作---总体而言,感觉像一个非常脆弱的设置。 –

回答

5

尝试的方法从Python端的问题:Python是一种伟大的胶水语言,我建议你有Python的运行您的MATLAB和C程式。 Python有:

  1. numpy的
  2. PyLab
  3. Matplotlib
  4. IPython的

因此,所述组合是对几乎任何现有的Matlab的模块的良好替代。

+2

虽然是民间的,这是最误导,无用,侮辱类的回应。侮辱,因为它分配非零概率的可能性,运算没有想到这一点。因为它忽略了“跨平台问题,专有工具链,认证门,许可技术以及对传统代码库和劳动力可用性问题的严格性能要求”(约翰卡马克),这可能是面临的问题。误导,因为你的意思是帮助(但是不)。 –