最新のリリースでは、このページがまだ翻訳されていません。 このページの最新版は英語でご覧になれます。

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)

構文エラー: 無効な構文

Python 2.7 から MATLAB 関数 print を呼び出して、MATLAB 関数 surf を使用して作成したプロットを出力します。

import matlab.engine
eng = matlab.engine.start_matlab()
eng.eval("surf(peaks)",nargout=0)
eng.print("-djpeg","surf",nargout=0)
  File "<stdin>", line 1
    eng.print("-djpeg","surf",nargout=0)
            ^
SyntaxError: invalid syntax

MATLAB 関数と Python 関数の名前が同じ場合、エンジンは MATLAB 関数を呼び出します。

ただし、エンジンは、Python 言語の予約語でもある名前をもつ MATLAB 関数を直接呼び出すことはできません。たとえば、Python 2.7 では print は予約語です (Python 3.x では、print は予約語ではなく組み込み関数なので、前述のコードは実行されます)。

このエラーを回避するには、eval を指定して MATLAB 関数を呼び出します。

eng.eval("print('-djpeg','surf');",nargout=0)

MATLAB 関数が、ユーザーが作成した関数の場合、その名前を変更して Python の予約語でなくなるようにできます。次の Python のドキュメンテーションに予約語のリストが掲載されています。

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() 

関連するトピック