2011-10-18 29 views
31

私はPython 2.6をMATLAB(7.12)に埋め込むことを試みています。私はCで書かれたmexファイルを埋め込みたいと思っていました。これはスカラーを使った小さな簡単な例でうまくいきました。しかし、Numpy(1.6.1)をインポートしても、MATLABはクラッシュします。MATLABにPythonを埋め込む

:MEXファイルに PyRun_SimpleString

from numpy import * 
  • :私はPythonのモジュール(の.py)で

    1. 含むnumpyのライブラリをロードするためのいくつかの方法を試してみましたので、私はとにかく言います

      PyRun_SimpleString(“from numpy import *”); 
      
    2. Py_oBject_CallObjectでnumpyの関数を呼び出す:

      ビジュアルで/ MD(マルチスレッド)スイッチを使用してコマンドラインからコンパイルされているシンプルなCファイルに埋め込まれたとき
      pOut = PyObject_CallObject(pFunc, pArgs); 
      

    もともと、私はこれはしかしC.でnumpyのを埋め込むに問題があるかもしれ考え、numpyのが正常に動作しますスタジオ2005 Cコンパイラ。次に、私は/ MDスイッチを含むようにMATLABのmakeファイルを変更すると考えました。そのような運がないと、mexopts.batは/ MDスイッチでコンパイルされます。 Numpy initモジュールの行を手動でコメントアウトして、MATLABがクラッシュしていたものを見つけました。拡張子pydのファイルをロードすると、MATLABがクラッシュするようです。 NumPyにロードされる最初のファイルはmultiarray.pydです。 MATLABのドキュメントでは、私が行ったVisual Studioで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の場合は1つ、Matlabの場合は1つ、おそらくNumpyの場合は1つ)を読み込むこととの競合です。最初の提案:あなたはどんな.pydファイルもクラッシュすると言う。あなたはナンシーからではないものを試しましたか?最初のステップは、この基本的な部分を動作させることです。その後、Numpy(これはより複雑です)を動作させることに移ります。(これを解決するにはあまりにも多くの作業が必要な場合は、計画BはPythonを別のプロセスで実行し、IPCメソッドを使用してMatlabと通信することになります) –

    +0

    良い点。あなたが言及する最初のオプションは、グラウンドへの.pydスレッドの後です。しかし、それはCコンパイルされたpydファイルを調べて、おそらく書き直すことを伴うかもしれません。 Pythonとの互換性のために以前の形式で保存されていなければならない)MATLABに.matファイルを保存するには1行のコードが必要です( 'data'、 'variable'、-v7 'を保存します) Python(variable = loadmat( 'data.mat'))をScipyパッケージ(scipy.io import loadmatから)に置き換えます。また、PythonでMATLAB関数をラップする方法についてもっと詳しく書かれているようですが、これは私が試してみるものです。 –

    +1

    私は埋め込みを避ける方が良い方法だと言います。数年前、私はMatlabの中にPythonを埋め込んだMEXファイルを書いて、すべてがうまく動作するようにしました。 (バイナリのPythonモジュール(.pyd/.so)もそこにロードされていましたが、解決できる問題がいくつかありました。しかし、Matlabの次のバージョンではうまく機能しませんでした---全体的に、かなり壊れやすいセットアップのように感じました。 –

    答えて

    5

    は、Python側から問題にアプローチしてください:Pythonは偉大な糊言語である、私はPythonがあなたのMATLABとCを実行させるあなたをお勧めしますプログラム。 Pythonはあります

    1. numpyの
    2. をPyLab
    3. matplotlibの
    4. IPython

    このように、組み合わせは、ほぼすべての既存のMatlabのモジュールのための良い代替手段です。

    +2

    市民権を有するが、これは最も間違った、役に立たない、侮辱的なものであるレスポンスのopはこれを考えなかった可能性にゼロ以外の確率を割り当てるため、侮辱します。 opがおそらく直面している、 "クロスプラットフォームの問題、独自のツールチェーン、認証ゲート、ライセンスされたテクノロジ、および従来のコードベースと労働力の可用性に関する問題の上に厳しいパフォーマンス要件"を無視しているので役に立たない。あなたが助けてくれることを意味しているので誤解されています(ただしないだけです)。 –

    関連する問題