pickletools — pickle 개발자를 위한 도구

pickletools — pickle 개발자를 위한 도구

소스 코드: Lib/pickletools.py

이 모듈은 pickle 모듈의 면밀한 세부 사항과 관련된 다양한 상수, 구현에 대한 긴 주석 몇 개, 그리고 pickle된 데이터를 분석하는 데 유용한 함수 몇 개를 담고 있어요. 이 모듈의 내용은 pickle을 작업하는 Python 핵심 개발자에게 유용해요. pickle 모듈의 일반 사용자라면 pickletools 모듈이 별로 관련 없을 거예요.

출처: Python 표준 라이브러리

본문

명령줄 사용법 (Command-line usage)

버전 3.2에 추가.

명령줄에서 python -m pickletools를 호출하면 하나 이상의 pickle 파일의 내용을 역어셈블(disassemble)해요. pickle에 저장된 Python 객체를 보고 싶다면 pickle 포맷의 세부 사항이 아니라 -m pickle을 사용하고 싶을 거예요. 다만 조사하려는 pickle 파일이 신뢰할 수 없는 소스에서 온 것이라면, -m pickletools가 pickle 바이트코드를 실행하지 않으므로 더 안전한 선택이에요.

예를 들어 파일 x.pickle에 tuple (1, 2)가 pickle되어 있다면:

$ python -m pickle x.pickle
(1, 2)

$ python -m pickletools x.pickle
    0: \x80 PROTO      3
    2: K    BININT1    1
    4: K    BININT1    2
    6: \x86 TUPLE2
    7: q    BINPUT     0
    9: .    STOP
highest protocol among opcodes = 2

명령줄 옵션 (Command-line options)

  • -a, --annotate — 각 줄에 짧은 opcode 설명을 주석으로 단다.
  • -o, --output=<file> — 출력을 쓸 파일의 이름.
  • -l, --indentlevel=<num> — 새 MARK 레벨을 들여쓸 공백 수.
  • -m, --memo — 여러 객체를 역어셈블할 때 역어셈블 사이에 memo를 유지한다.
  • -p, --preamble=<preamble> — pickle 파일이 하나 이상 지정되면 각 역어셈블 앞에 주어진 머리말을 출력한다.
  • pickle_file — 읽을 pickle 파일. 또는 표준 입력에서 읽는다는 뜻의 -.

프로그래밍 인터페이스 (Programmatic interface)

pickletools.dis(pickle, out=None, memo=None, indentlevel=4, annotate=0)

pickle의 기호 역어셈블(symbolic disassembly)을 파일류 객체 out에 출력하며, 기본값은 sys.stdout이에요. pickle은 문자열 또는 파일류 객체일 수 있어요. memo는 pickle의 memo로 사용될 Python 사전일 수 있으며, 같은 pickler가 만든 여러 pickle에 걸쳐 역어셈블을 수행하는 데 사용할 수 있어요. 스트림의 MARK opcode로 표시되는 연속 레벨은 indentlevel개의 공백으로 들여써져요. annotate에 0이 아닌 값이 주어지면 출력의 각 opcode에 짧은 설명이 주석으로 붙어요. annotate의 값은 주석이 시작되어야 할 열에 대한 힌트로 사용돼요.

버전 3.2에서 변경: annotate 매개변수 추가.

pickletools.genops(pickle)

pickle의 모든 opcode에 대한 이터레이터를 제공하며, (opcode, arg, pos) 3-튜플의 시퀀스를 돌려줘요. opcodeOpcodeInfo 클래스의 인스턴스이고, arg는 opcode 인자의 디코딩된 값(Python 객체)이며, pos는 이 opcode가 위치한 자리예요. pickle은 문자열 또는 파일류 객체일 수 있어요.

pickletools.optimize(picklestring)

사용되지 않는 PUT opcode를 제거한 뒤 동등한 새 pickle 문자열을 돌려줘요. 최적화된 pickle은 더 짧고, 전송 시간이 덜 들고, 저장 공간도 덜 차지하며, 더 효율적으로 언피클링돼요.