pickletools — pickle 开发者工具

源代码: Lib/pickletools.py


此模块包含与 pickle 模块内部细节相关的各种常量、关于实现的冗长注释,以及一些用于分析 pickled 数据的有用函数。此模块的内容对开发 pickle 的 Python 核心开发者很有用;pickle 模块的普通用户可能不会觉得 pickletools 模块相关。

命令行用法

在 3.2 版本加入。

从命令行调用时,python -m pickletools 将反汇编一个或多个 pickle 文件的内容。请注意,如果您想查看 pickle 中存储的 Python 对象而不是 pickle 格式的详细信息,您可能希望使用 -m pickle。但是,当您想要检查的 pickle 文件来自不受信任的源时,-m pickletools 是一个更安全的选择,因为它不执行 pickle 字节码。

例如,对于文件 x.pickle 中 pickled 的元组 (1, 2)

$ 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

命令行选项

-a, --annotate

用简短的操作码描述注释每一行。

-o, --output=<file>

输出文件的名称。

-l, --indentlevel=<num>

新 MARK 级别缩进的空格数。

-m, --memo

当反汇编多个对象时,在反汇编之间保留 memo。

-p, --preamble=<preamble>

当指定多个 pickle 文件时,在每次反汇编前打印给定的前导。

pickle_file

要读取的 pickle 文件,或 - 表示从标准输入读取。

编程接口

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

将 pickle 的符号反汇编输出到类文件对象 out,默认为 sys.stdoutpickle 可以是字符串或类文件对象。memo 可以是一个 Python 字典,用作 pickle 的备忘录;它可用于对由同一 pickler 创建的多个 pickle 进行反汇编。由流中的 MARK 操作码指示的连续级别按 indentlevel 个空格缩进。如果为 annotate 提供非零值,则输出中的每个操作码都将用简短描述进行注释。annotate 的值用作注释开始列的提示。

3.2 版本中已更改: 添加了 annotate 参数。

pickletools.genops(pickle)

提供一个 迭代器,遍历 pickle 中的所有操作码,返回一个 (opcode, arg, pos) 三元组序列。opcodeOpcodeInfo 类的实例;arg 是操作码参数的解码值,作为 Python 对象;pos 是此操作码所在的位置。pickle 可以是字符串或类文件对象。

pickletools.optimize(picklestring)

在消除未使用的 PUT 操作码后,返回一个新的等效 pickle 字符串。优化后的 pickle 更短,传输时间更少,存储空间更小,并且解 pickle 更高效。