📅  最后修改于: 2020-11-07 08:23:32             🧑  作者: Mango
Python标准库中的元帅模块的对象序列化功能类似于pickle模块。但是,此模块不用于通用数据。另一方面, Python本身将其用于Python的内部对象序列化,以支持对Python模块的编译版本(.pyc文件)进行读/写操作。
封送模块使用的数据格式在Python版本之间不兼容。因此,一个版本的已编译Python脚本(.pyc文件)很可能不会在另一版本上执行。
就像泡菜模块一样,封送模块也定义了load()和dump()函数,用于将编组对象从/写入文件。
此函数将受支持的Python对象的字节表示形式写入文件。该文件本身是具有写权限的二进制文件
此函数从二进制文件读取字节数据,并将其转换为Python对象。
以下示例演示了如何使用dump()和load()函数来处理Python的代码对象,这些代码对象用于存储预编译的Python模块。
该代码使用内置的compile()函数从嵌入Python指令的源字符串构建代码对象。
compile(source, file, mode)
file参数应该是从中读取代码的文件。如果不是从文件读取的,则传递任何任意字符串。
如果源包含语句序列,则模式参数为“ exec”,如果包含单个表达式,则为“ eval”,如果包含单个交互式语句,则为“单个”。
然后,使用dump()函数将编译代码对象存储在.pyc文件中。
import marshal
script = """
a=10
b=20
print ('addition=',a+b)
"""
code = compile(script, "script", "exec")
f=open("a.pyc","wb")
marshal.dump(code, f)
f.close()
要反序列化,.pyc文件中的对象使用load()函数。由于它返回一个代码对象,因此可以使用另一个内置函数exec()运行它。
import marshal
f=open("a.pyc","rb")
data=marshal.load(f)
exec (data)