Main Content

Python での MATLAB エラーのトラブルシューティング

Python での MATLAB エラー

MATLAB® 関数でエラーが発生すると、Python® 用 MATLAB エンジンはその関数を停止し、MATLAB が発行した例外を受け取ります。エンジンはエラー メッセージを新しい Python 例外にコピーします。エンジンは Python 例外を発行します。

Python インタープリターが例外を受け取った場合、インタープリターは MATLAB からのエラー メッセージを表示します。エンジンが発行した例外を Python コードで処理することもできます。エンジンが発行できる例外のタイプは、matlab.engine.MatlabEngine および matlab.engine.FutureResult のリファレンス ページを参照してください。

MatlabExecutionError: 未定義の関数

Python から、整数に対して MATLAB 関数 sqrt を呼び出します (次のコード サンプルは Python トレース バックを省略し、エラー メッセージのみを表示します)。

import matlab.engine
eng = matlab.engine.start_matlab()
print(eng.sqrt(4))
matlab.engine.MatlabExecutionError: Undefined function 'sqrt' for input arguments of type 'int64'.

MATLAB は 関数 sqrt を定義しますが、入力引数は整数ではなく、double データ型であることを求めます。ただし、入力引数は 4 で、MATLAB に渡される前に Python は 4 を整数として解釈します。エンジンは、Python の整数を int64 MATLAB データ型に変換します。

数値について MATLAB と Python の既定の型は異なります。MATLAB コマンド ラインに「x = 4」と入力した場合、x は MATLAB の double です。Python コマンド ラインに「x = 4」と入力した場合、x は Python の int です。

このエラーを回避するには、Python データ型 float の入力引数を指定します。エンジンはこの型を MATLAB double に変換します。

print(eng.sqrt(4.0))
2.0

構文エラー: 式が有効なターゲットではない

MATLAB 関数 eval を Python から呼び出して MATLAB 変数を作成できます (次のコード サンプルは Python トレース バックを省略し、エラー メッセージのみを表示します)。

import matlab.engine
eng = matlab.engine.start_matlab()
eng.eval("x = 4;")
SyntaxError: Error: The expression to the left of the equals sign is not a 
valid target for an assignment.

エンジンが eval を呼び出すと、実行するステートメントが MATLAB に渡されます。入力引数 nargout を指定しない場合、エンジンは 1 つの出力引数を想定します。ただし、この MATLAB ステートメントは出力引数を返しません。

このエラーを回避するには、呼び出す MATLAB 関数が出力引数を返さないときは、nargout を 0 と指定します。

eng.eval("x = 4;",nargout=0)

PythonMATLAB セッションを検出できない

MATLAB でオペレーティング システムの環境変数 TEMP または TMP をオーバーライドした場合、Python は Python 用の MATLAB エンジンに接続できないことがあります。たとえば、Python プロンプトで次を入力します。

matlab.engine.find_matlab()

Python は () を表示します。

Python 用の MATLAB エンジンは一時フォルダーを使用して MATLAB の共有セッションの情報を記録します。この問題を回避するには、Python で環境変数に次の変更を加えます。temp_folder は MATLAB で設定したフォルダーのパスです。

os.environ['TMP'] = r'temp_folder'
os.environ['TEMP'] = r'temp_folder'
eng=matlab.engine.find_matlab() 

関連するトピック