맞춤형 Python 인터프리터
맞춤형 Python 인터프리터 (Custom Python Interpreters)
이 장에서 설명하는 모듈들은 Python의 대화형 인터프리터와 유사한 인터페이스를 작성할 수 있게 해 줍니다. Python 언어 외에 어떤 특별한 기능을 지원하는 Python 인터프리터를 원한다면 code 모듈을 살펴보아야 합니다.
본문
일반 Python 인터프리터와 다르게 동작하거나 추가 기능을 제공하는 대화형 인터프리터를 만들고 싶을 때 사용하는 모듈들을 정리한 장입니다. 이 장에는 다음 모듈들이 문서화되어 있습니다.
code — 인터프리터 기본 클래스
code 모듈은 Python 대화형 인터프리터처럼 동작하는 프로그램을 작성하는 데 필요한 기본 클래스들을 제공합니다. 주요 내용:
- 대화형 인터프리터 객체(Interactive Interpreter Objects) —
InteractiveInterpreter클래스는 Python 코드를 실행하는 최소한의 대화형 실행기를 제공합니다. - 대화형 콘솔 객체(Interactive Console Objects) —
InteractiveConsole클래스는InteractiveInterpreter를 확장하여 대화형 콘솔의 친숙한 프롬프트와 반환 코드를 제공합니다. 이 클래스는code.py를 실행하면 얻어지는python인터프리터를 구현하는 데도 사용됩니다.
code 모듈을 사용하면 표준 python 인터프리터의 프롬프트, 초기 배너, 자동 인덴트 감지 등을 재현할 수 있습니다. 예를 들어 InteractiveConsole()을 만들고 interact() 메서드를 호출하면 대화형 셸이 시작됩니다. 배너와 초기 프롬프트를 커스터마이즈할 수 있습니다.
codeop — Python 코드 컴파일
codeop 모듈은 code 모듈에서 사용되는 저수준 모듈로, 완전하지 않을 수 있는(불완전한) Python 코드 조각을 컴파일하는 것을 지원합니다. 이 모듈은 사용자가 대화형으로 코드를 입력할 때 그 코드가 더 많은 입력을 기대하는지(예: 블록의 중간에 있거나 괄호가 닫히지 않은 경우) 판단하는 데 유용합니다.
codeop.compile_command(source, filename="<input>", symbol="single") 함수를 사용하면 주어진 소스 코드가 완전한 문인지, 불완전한 문인지, 아니면 오류인지를 구분할 수 있습니다. 이는 대화형 인터프리터가 프롬프트(">>> "에서 "..."로)를 적절히 바꾸는 데 필요한 핵심 기능입니다. codeop는 일반 사용자가 직접 쓰기보다는 code 모듈이나 맞춤형 인터프리터의 기반으로 사용되는 저수준 모듈입니다.
즉, 특수 기능을 가지는 인터프리터를 만들려면 code 모듈을 사용하면 되고, codeop 모듈은 더 저수준으로 불완전한 Python 코드 조각 컴파일을 지원하기 위해 사용됩니다. 두 모듈은 함께 대화형 실행 환경을 구현하는 토대를 제공합니다.
code 모듈을 사용하면 표준 python 인터프리터의 프롬프트, 초기 배너, 자동 인덴트 감지 등을 재현할 수 있습니다. 예를 들어 InteractiveConsole()을 만들고 interact() 메서드를 호출하면 대화형 셸이 시작됩니다. 배너와 초기 프롬프트를 커스터마이즈할 수 있습니다.
InteractiveInterpreter 클래스는 runcode() 같은 메서드로 주어진 코드를 실행하고, runsource()가 소스가 완전한지·불완전한지·오류인지를 판별합니다. 이를 바탕으로 InteractiveConsole은 >>>와 ... 프롬프트를 적절히 전환하고, 입력된 각 명령의 결과를 write() 메서드로 출력합니다.
InteractiveConsole.interact()는 전체 대화형 세션을 시작하며, banner 인자로 시작 배너를, exitmsg로 종료 메시지를 지정할 수 있습니다. interact()는 EOF(예: Ctrl-D)가 입력되면 반환합니다. 또한 push() 메서드로 한 줄씩 명령을 밀어 넣어 code 객체를 직접 만들 수도 있습니다.
codeop 모듈의 compile_command()는 주어진 소스를 컴파일하고 결과를 판단합니다: 완전한 문이면 코드 객체, 더 입력이 필요한 불완전한 문이면 None, 문법 오류가 있으면 SyntaxError를 발생시킵니다. symbol="single", "eval", "exec"로 컴파일 모드를 선택할 수 있습니다.
이 두 모듈은 임베디드 셸, 원격 디버깅 콘솔, 교육용 REPL, IDE의 인터랙티브 창 등 다양한 대화형 실행 환경을 구축하는 데 사용됩니다.