Incrustar datos de salmuera (o arbitrarios) en el script de Python

En Perl, el tipo de intérprete se detiene cuando encuentra una línea con

__END__ 

en eso. Esto se usa a menudo para incrustar datos arbitrarios al final de un script perl. De esta manera, el script perl puede recuperar y almacenar datos que almacena “en sí mismo”, lo que permite oportunidades bastante agradables.

En mi caso tengo un objeto en escabeche que quiero almacenar en algún lugar. Si bien puedo usar un archivo file.pickle bien, estaba buscando un enfoque más compacto (para distribuir el script más fácilmente).

¿Existe algún mecanismo que permita integrar datos arbitrarios dentro de un script de python de alguna manera?

Si los datos no son particularmente grandes (muchos K), simplemente los codificaría (‘base64’) e incluiría eso en una cadena de tres comillas, con .decode (‘base64’) para recuperar los datos binarios, y un pickle .loads () llaman a su alrededor.

Con pickle también puedes trabajar directamente sobre cuerdas.

 s = pickle.dumps(obj) pickle.loads(s) 

Si combina eso con “” “(cadenas entre comillas triples), puede almacenar fácilmente cualquier información encurtida en su archivo.

En Python, puede usar “” “(cadenas de comillas triples) para incrustar largas series de datos de texto en su progtwig.

En tu caso, sin embargo, no pierdas el tiempo en esto.

Si tiene un objeto que ha decapado, sería mucho más feliz volcar ese objeto como fuente de Python y simplemente incluir la fuente.

La función repr , aplicada a la mayoría de los objetos, emitirá una versión del código fuente de Python del objeto. Si implementas __repr__ para todas tus clases personalizadas, puedes volcar trivialmente tu estructura como fuente de Python.

Si, por otro lado, su estructura en escabeche comenzó como un código Python, simplemente déjelo como código Python.

Hice este código. Ejecutas algo como python comp.py foofile.tar.gz, y crea decomp.py, con el contenido de foofile.tar.gz incrustado en él. Sin embargo, no creo que esto sea realmente portátil con Windows debido al Popen.

 import base64 import sys import subprocess inf = open(sys.argv[1],"r+b").read() outs = base64.b64encode(inf) decomppy = '''#!/usr/bin/python import base64 def decomp(data): fname = "%s" outf = open(fname,"w+b") outf.write(base64.b64decode(data)) outf.close() # You can put the rest of your code here. #Like this, to unzip an archive #import subprocess #subprocess.Popen("tar xzf " + fname, shell=True) #subprocess.Popen("rm " + fname, shell=True) ''' %(sys.argv[1]) taildata = '''uudata = """%s""" decomp(uudata) ''' %(outs) outpy = open("decomp.py","w+b") outpy.write(decomppy) outpy.write(taildata) outpy.close() subprocess.Popen("chmod +x decomp.py",shell=True)