Когда функция MATLAB® повышает ошибку, MATLAB Engine для Python® останавливает функцию и отлавливает исключение, повышенное MATLAB. Механизм копирует сообщение об ошибке в новое исключение Python. Механизм повышает исключение Python.
Если Интерпретатор Python отлавливает исключение, интерпретатор отображает сообщение об ошибке, которое прибыло из MATLAB. Также можно обработать исключения, повышенные механизмом в коде Python. Смотрите matlab.engine.MatlabEngine
и страницы с описанием matlab.engine.FutureResult
для типов исключений, которые может повысить механизм.
Вызовите функцию sqrt
MATLAB на целом числе из Python. (Этот пример кода не использует 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 в тип данных MATLAB int64
.
MATLAB и Python задают различные типы по умолчанию для чисел. Если вы вводите x = 4
в командной строке MATLAB, x
является double
MATLAB. Если вы вводите x = 4
в командной строке Python, x
является int
Python.
Чтобы избежать этой ошибки, задайте входные параметры, которые имеют тип данных Python float
. Механизм преобразовывает этот тип в MATLAB double
.
print(eng.sqrt(4.0))
2.0
Можно вызвать функцию eval
MATLAB из 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
, механизм ожидает один выходной аргумент. Однако этот оператор MATLAB не возвращает выходных аргументов.
Чтобы избежать этой ошибки, задайте nargout
как 0 каждый раз, когда функция MATLAB, которую вы вызываете, не возвращает выходных аргументов.
eng.eval("x = 4;",nargout=0)
Вызовите функцию print
MATLAB из Python 2.7, чтобы распечатать график, который вы создаете с функцией surf
MATLAB.
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.
Однако механизм не может непосредственно вызвать функцию MATLAB, которая имеет имя, которое также является зарезервированным словом на языке Python. Например, в Python 2.7, print
является зарезервированным словом. (В Python 3.x запускается предыдущий код, потому что print
является встроенной функцией, не зарезервированным словом.)
Чтобы избежать этой ошибки, вызовите функцию MATLAB с eval
.
eng.eval("print('-djpeg','surf');",nargout=0)
Если функция MATLAB является функцией, которую вы создали, можно переименовать ее так, чтобы ее имя больше не было зарезервированным словом Python. Документация Python перечисляет зарезервированные слова:
Зарезервированные слова Python 2.7 (https://docs.python.org/2/reference/lexical_analysis.html#keywords
)
Зарезервированные слова Python 3.x (https://docs.python.org/3/reference/lexical_analysis.html#keywords
)
Если вы заменяете операционную систему TEMP
или переменные окружения TMP
в MATLAB, Python не может смочь соединиться с MATLAB Engine для Python. Например, если вы вводите следующее в подсказке Python:
matlab.engine.find_matlab()
Python отображает ()
.
MATLAB Engine для Python использует временную папку, чтобы записать информацию для разделяемых сеансов работы с MATLAB. Чтобы работать вокруг этой проблемы, внесите следующие изменения в переменные окружения в Python. temp_folder
является путем к папке, которую вы устанавливаете в MATLAB.
os.environ['TMP'] = r'temp_folder' os.environ['TEMP'] = r'temp_folder' eng=matlab.engine.find_matlab()