Main Content

이 번역 페이지는 최신 내용을 담고 있지 않습니다. 최신 내용을 영문으로 보려면 여기를 클릭하십시오.

Python에서 MATLAB 오류 해결하기

PythonMATLAB 오류

MATLAB® 함수에서 오류가 발생하면 Python®용 MATLAB 엔진은 함수를 중지하고 MATLAB에서 발생시키는 예외를 포착합니다. 엔진은 오류 메시지를 새 Python 예외로 복사합니다. 엔진에서 Python 예외를 발생시킵니다.

Python 인터프리터가 예외를 포착하면 MATLAB에서 온 오류 메시지를 표시합니다. 또한, Python 코드에서 엔진이 발생시킨 예외를 처리할 수도 있습니다. 엔진이 발생시킬 수 있는 예외 유형을 알아보려면 matlab.engine.MatlabEnginematlab.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

SyntaxError: 표현식이 유효한 대상이 아님

Python에서 MATLAB eval 함수를 호출하여 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 명령문은 출력 인수를 반환하지 않습니다.

이 오류를 피하려면, 호출하는 MATLAB 함수에서 출력 인수를 반환하지 않을 경우 항상 nargout을 0으로 지정하십시오.

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

SyntaxError: 유효하지 않은 구문

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 도움말 문서에 예약어 목록이 나와 있습니다.

Python에서 MATLAB 세션을 찾을 수 없음

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

관련 항목