Когда 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 в int64
Тип данных MATLAB.
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()