Skip to main content

32.13. pickletools —为pickle开发者的工具

源代码: Lib/pickletools.py


该模块包含与 pickle 模块的详细细节相关的各种常量,关于实现的一些冗长的评论以及用于分析pickled数据的一些有用的功能。这个模块的内容对于正在使用 pickle 的Python核心开发人员非常有用;普通用户的 pickle 模块可能找不到 pickletools 模块相关。

32.13.1. 命令行用法

3.2 新版功能.

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

例如,使用在文件 x.pickle 中pickling的元组 (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

32.13.1.1. 命令行选项

-a, --annotate

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

-o, --output=<file>

应写入输出的文件的名称。

-l, --indentlevel=<num>

缩进新MARK级别的空白数。

-m, --memo

当多个对象被拆卸时,保存在反汇编之间的备忘录。

-p, --preamble=<preamble>

当指定多个pickle文件时,在每次拆卸之前打印给定的前导。

32.13.2. 程序接口

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

将腌汁的符号反汇编输出到类文件对象 out,默认为 sys.stdoutpickle 可以是字符串或类似文件的对象。 memo 可以是将被用作pickle的备忘录的Python字典;它可以用于在由相同的拾取器创建的多个腌汁之间执行拆卸。由流中的 MARK 操作码指示的连续级别由 indentlevel 空间缩进。如果向 annotate 给出非零值,则输出中的每个操作码都用短描述注释。 annotate 的值用作注释应该开始的列的提示。

3.2 新版功能: annotate 参数。

pickletools.genops(pickle)

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

pickletools.optimize(picklestring)

删除未使用的 PUT 操作码后返回一个新的等效pickle字符串。优化的泡菜更短,需要更少的传输时间,需要更少的存储空间,更有效地解开。