Computer >> 컴퓨터 >  >> 프로그래밍 >> Python

파이썬 바이트 컴파일 라이브러리 py_compile 완벽 가이드

파이썬과 바이트코드의 관계

파이썬은 인터프리터 기반 언어입니다. 하지만 스크립트(.py 확장자)를 실행하면 내부적으로 소스 코드를 바이트코드(bytecode)로 컴파일한 뒤, 그 결과물은 자동으로 제거됩니다.

반면 미리 컴파일된 내장 모듈을 제외한 일반 모듈을 처음 임포트(import)할 때는 컴파일된 버전이 자동으로 생성되어 __pycache__ 폴더에 .pyc 확장자로 저장됩니다. 이후 동일한 모듈을 다시 임포트하면 재컴파일하지 않고 이미 만들어진 바이트코드를 그대로 사용하기 때문에 실행 속도가 빨라집니다.

py_compile 모듈이란?

파이썬에서는 .py 확장자를 가진 스크립트 파일을 실제로 실행하지 않고도 명시적으로 컴파일할 수 있습니다. 이때 사용하는 것이 py_compile 모듈이며, 이 모듈 안의 compile() 함수가 해당 작업을 담당합니다.

생성되는 .pyc 파일 이름에는 파이썬 버전 번호가 붙습니다. 예를 들어 파이썬 3.7에서 컴파일하면 파일명 끝에 'cpython-37' 접미사가 추가됩니다.

평소에는 이 모듈이 꼭 필요하지 않지만, 여러 사용자가 함께 쓰는 환경에 모듈을 설치할 때 유용합니다. 특히 소스 코드가 있는 디렉터리에 바이트코드 캐시 파일을 쓸 권한이 없는 사용자가 있을 경우에 활용 가치가 큽니다.

명령줄에서 바이트 컴파일하기

py_compile 모듈은 명령줄 인터페이스도 제공합니다. -m 스위치를 사용해 다음과 같이 실행할 수 있습니다.

E:\python37>python -m py_compile hello.py

이 명령을 실행하면 __pycache__ 하위 폴더에 'hello.cpython-37.pyc' 파일이 생성되어 저장됩니다.

compile() 함수로 프로그래밍 방식 컴파일

바이트 컴파일은 py_compile 모듈의 compile() 함수를 사용해 프로그램 코드 안에서 직접 수행할 수도 있습니다.

import py_compile
py_compile.compile("hello.py")

.pyc 파일 직접 실행하기

.pyc 확장자를 가진 바이트코드 파일은 일반 .py 스크립트처럼 명령줄에서 바로 실행할 수 있습니다.

E:\python37>python __pycache__/hello.cpython-37.pyc

다만 중요한 제약이 있습니다. 바이트코드 파일은 반드시 컴파일에 사용된 것과 같은 버전의 인터프리터로만 실행할 수 있습니다. 다른 버전의 파이썬으로 실행하려고 하면 아래와 같은 오류가 발생합니다.

C:\python36>python e:hello.cpython-37.pyc
RuntimeError: Bad magic number in .pyc file

여러 파일 한 번에 컴파일하기 — main()

py_compile 모듈에는 여러 개의 소스 파일을 한꺼번에 컴파일하는 main() 함수도 있습니다. 인수로 지정된 파일들이 컴파일되며, 그 결과 바이트코드는 평소와 같은 방식으로 캐시됩니다. 단, 이 함수는 디렉터리 구조를 검색해 소스 파일을 찾지 않으며, 명시적으로 이름이 지정된 파일만 컴파일한다는 점에 유의해야 합니다.

PyCompileError 예외 처리

이 모듈은 컴파일 도중 오류가 발생했을 때 발생(raise)되는 PyCompileError 예외도 정의하고 있습니다. 단, 이 예외는 compile() 함수 호출 시 doraise 옵션이 True로 설정된 경우에만 발생합니다.

optimize 옵션으로 최적화 수준 조절

compile() 함수의 optimize 옵션은 최적화 수준을 제어하며, 그 값이 내장 compile() 함수로 전달됩니다. 기본값인 -1을 지정하면 현재 실행 중인 인터프리터의 최적화 수준이 그대로 적용됩니다.