Python Data Persistence - Marshal Module

Os recursos de serialização de objeto do módulo marshal na biblioteca padrão do Python são semelhantes ao módulo pickle. No entanto, este módulo não é usado para dados de uso geral. Por outro lado, ele é usado pelo próprio Python para serialização de objetos internos do Python para suportar operações de leitura / gravação em versões compiladas de módulos Python (arquivos .pyc).

O formato de dados usado pelo módulo marshal não é compatível com as versões do Python. Portanto, um script Python compilado (arquivo .pyc) de uma versão provavelmente não será executado em outra.

Assim como o módulo pickle, o módulo marshal também definiu as funções load () e dump () para ler e gravar objetos empacotados de / para o arquivo.

despejar ()

Esta função grava a representação de bytes do objeto Python com suporte em um arquivo. O próprio arquivo é um arquivo binário com permissão de gravação

carga()

Esta função lê os dados de byte de um arquivo binário e os converte em um objeto Python.

O exemplo a seguir demonstra o uso das funções dump () e load () para manipular objetos de código do Python, que são usados ​​para armazenar módulos Python pré-compilados.

O código usa compile() função para construir um objeto de código a partir de uma string de origem que incorpora instruções Python.

compile(source, file, mode)

O parâmetro do arquivo deve ser o arquivo do qual o código foi lido. Se não foi lido de um arquivo, passe qualquer string arbitrária.

O parâmetro de modo é 'exec' se a origem contém uma sequência de instruções, 'eval' se há uma única expressão ou 'único' se contém uma única instrução interativa.

O objeto de código de compilação é então armazenado em um arquivo .pyc usando a função dump ().

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()

Para desserializar, o objeto do arquivo .pyc usa a função load (). Como ele retorna um objeto de código, ele pode ser executado usando exec (), outra função interna.

import marshal
f=open("a.pyc","rb")
data=marshal.load(f)
exec (data)