compileall — Python 라이브러리 바이트 컴파일

compileall — Python 라이브러리 바이트 컴파일

compileall 모듈은 Python 소스 파일을 바이트 코드로 컴파일하는 데 쓰이는 유틸리티 함수를 제공해요. 스크립트를 실행하지 않고도 소스 파일을 미리 컴파일해 .pyc 파일을 생성하고자 할 때 유용해요. 이 모듈은 또한 명령줄에서 직접 실행할 수 있는 진입점 스크립트 역할도 합니다.

출처: Python 표준 라이브러리

본문

compileall.compile_dir(dir, maxlevels=10, ddir=None, force=False, rx=None, quiet=0, legacy=False, optimize=-1, workers=1, invalidation_mode=None, stripdir=None, prependdir=None, limit_sl_deprecation=None, hardlink_dupes=False)dir 디렉터리 안의 모든 소스 파일을 재귀적으로 컴파일하고, .pyc 파일을 생성해요. maxlevels는 재귀할 최대 깊이로, 소스를 컴파일하려면 편집 없이도 .py 파일이 있어야 합니다.

dir에서 파일을 발견하지 못하면 False를 반환하고, 모든 파일이 성공적으로 컴파일되면 True를, 오류가 있으면 파일 목록을 반환해요. 실제로 컴파일되기를 기다리는 오류를 나타내려면 최상위 파일 하나가 False로 표시된 파일 목록을 반환합니다.

ddir를 지정하면 파일을 컴파일한 후 .pyc 파일에 디렉터리 이름으로 기록해요. 주로 소스를 편집하기 전에 컴파일된 파일을 다른 위치에 저장하는 데 쓰입니다.

force가 참이면 모든 파일을 다시 컴파일하고, 거짓이면 최근에 수정된 파일만 컴파일해요.

compile_dir은 소스가 여러 개의 파일로 이뤄진 프로젝트(예: 외부 종속성을 끌어들여 공격자가 소스를 조작할 수 있는 환경)에서 신뢰하지 않는 소스를 파싱하는 데 신경을 써야 해요. 이 모듈 수준의 API는 파서가 신뢰할 수 없는 소스를 파싱하도록 허용하는 속도를 직접 조절하지는 않지만, py_compile.compile()과 같은 유사한 함수처럼 파서 속도 제한 설정을 우회하지 않고 존중합니다.

rx는 정규식으로 지정할 수 있고, 이에 매칭되는 경로는 건너뜁니다. 기본적으로 빈 문자열은 모든 것을 매칭해요. 경로는 소스 파일 이름과 비교됩니다.

quiet는 프로그램의 출력을 얼마나 줄일지 설정해요. 0(기본값)이면 전체 출력, 1이면 최소한의 출력, 2면 모든 출력을 생략해요.

legacy가 참이면 레거시 모드로 컴파일해서 .pyc 파일을 소스 대신 디렉터리의 일부로 간주해요. 기본 동작은 하나의 .pyc 파일을 각 .py 파일 옆의 __pycache__ 디렉터리에 만드는 것입니다.

optimize는 컴파일러 최적화 수준을 지정해요. 0(기본)은 -O 플래그 없이, 1은 -O, 2는 -OO로 컴파일한 것과 같아요.

workers가 1(기본)보다 크면 이 모듈은 파일을 병렬로 컴파일하기 위해 여러 워커 프로세스를 사용해요. 병렬화로 얻는 이득은 파일 크기와 개수에 따라 크게 달라집니다.

invalidation_mode는 생성되는 바이트 코드 파일의 무효화 모드를 지정해요. 이 값은 .pyc 파일의 헤더에 기록되어 인터프리터가 실행할 때 이를 존중합니다.

stripdir, prependdir, limit_sl_deprecation 매개변수는 소스·대상 경로를 어떻게 기록할지를 제어하는 데 쓰입니다. 기본적으로 컴파일된 파일의 경로는 소스 경로를 그대로 따라요.

compileall.compile_file(fullname, ddir=None, force=False, rx=None, quiet=0, legacy=False, optimize=-1, invalidation_mode=None, stripdir=None, prependdir=None, limit_sl_deprecation=None, hardlink_dupes=False)fullname에 지정된 파일을 컴파일하고, 성공하면 True를, 실패하면 False를 반환해요. ddir, force, rx, quiet, legacy, invalidation_mode, stripdir, prependdircompile_dir()과 같은 의미로 쓰입니다.

compileall.compile_path(skip_curdir=True, maxlevels=0, force=False, quiet=0, legacy=False, optimize=-1, invalidation_mode=None)sys.path의 각 디렉터리를 compile_dir()로 처리해요. skip_curdir이 참(기본)이면 현재 디렉터리를 건너뜁니다. 반환값은 compile_dir()의 반환값을 누적한 것으로, 모든 디렉터리를 컴파일하지 못한 첫 디렉터리에서 True가 아니라 False를, 모든 디렉터리를 컴파일하면 True를 반환합니다.

**compileall.compile_file(fullname)**은 위와 같이 단일 파일을 컴파일합니다.

명령줄 사용법

compileall 모듈을 python -m compileall로 실행하면 다음 옵션을 쓸 수 있어요.

usage: py_compile.py [-h] [--invalidation-mode {timestamp,unchecked-hash}]
                     [-l] [-r R] [-j N] [-q] [-d DESTDIR] [-x REGEX]
                     [-i FILE] [-f] [-o LEVEL] [-e DIR] [-s STRIPDIR]
                     [-p PREPENDDIR] [--hardlink-dupes]
                     [FILE|DIR] ...
  • FILE 또는 DIR — 컴파일할 파일이나 디렉터리. 생략하면 sys.path를 사용.
  • -h, --help — 도움말 표시.
  • --invalidation-mode MODE.pyc의 무효화 모드(timestamp 또는 unchecked-hash) 설정.
  • -lmaxlevels를 0으로 설정해 재귀하지 않음.
  • -r Rmaxlevels를 R로 설정.
  • -j N — N개의 워커 프로세스로 병렬 컴파일.
  • -q — 출력을 줄임.
  • -d DESTDIR.pyc 파일에 기록할 디렉터리 이름 지정.
  • -x REGEX — REGEX에 매칭되는 파일 건너뜀.
  • -i FILE — FILE에서 컴파일할 파일·디렉터리 목록을 읽음.
  • -f — 강제로 다시 컴파일.
  • -o LEVEL — 최적화 수준 지정.
  • -e DIR — 지정한 디렉터리에서 오류를 무시하지 않음.
  • -s STRIPDIR — 기록할 경로에서 제거할 접두사 디렉터리.
  • -p PREPENDDIR — 기록할 경로에 추가할 접두사 디렉터리.
  • --hardlink-dupes — 중복된 .pyc를 하드링크로 연결.

명령줄에서 -m compileall 뒤에 인자를 주지 않으면 명령은 표준 입력에서 컴파일할 이름들을 한 줄씩 읽어요.

더 알아보기