Когда MATLAB® функция вызывает ошибку, MATLAB Engine для Python® останавливает функцию и захватывает исключение, вызванное MATLAB. Модуль копирует сообщение об ошибке в новое исключение Python. Движок поднимает исключение Python.
Если интерпретатор Python захватывает исключение, интерпретатор отображает сообщение об ошибке, полученное из MATLAB. Вы также можете обрабатывать исключения, вызванные движком в коде Python. Смотрите matlab.engine.MatlabEngine
и matlab.engine.FutureResult
страницы с описанием для типов исключений, которые может вызвать механизм.
Вызовите MATLAB sqrt
функция от целого числа на языке 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 в int64
Тип данных MATLAB.
MATLAB и Python определяют различные типы по умолчанию для чисел. Если вы вводите x = 4
в командной строке MATLAB, x
является MATLAB double
. Если вы вводите x = 4
в командной строке Python, 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
входной параметр, двигатель ожидает один выходной аргумент. Однако это выражение MATLAB не возвращает выходных аргументов.
Чтобы избежать этой ошибки, задайте nargout
значение 0 всякий раз, когда функция MATLAB, которую вы вызываете, не возвращает выходных аргументов.
eng.eval("x = 4;",nargout=0)
Вызовите MATLAB print
функция из Python 2.7 для печати графика, созданного с помощью 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.
Однако механизм не может непосредственно вызвать функцию 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 for Python использует временную папку для записи информации об общих сеансах работы с MATLAB. Чтобы решить эту проблему, внесите следующие изменения в переменные окружения в Python. temp_folder
- путь к папке, заданный в MATLAB.
os.environ['TMP'] = r'temp_folder' os.environ['TEMP'] = r'temp_folder' eng=matlab.engine.find_matlab()