2009-12-11 7 views
4

En Perl, le type d'interpréteur d'arrêts quand il rencontre une ligne avecpickle Intégrer (ou arbitraires) des données dans le script python

__END__ 

en elle. Ceci est souvent utilisé pour incorporer des données arbitraires à la fin d'un script Perl. De cette manière, le script perl peut récupérer et stocker des données qu'il stocke «en lui-même», ce qui permet de créer de belles opportunités.

Dans mon cas, j'ai un objet mariné que je veux stocker quelque part. Bien que je puisse très bien utiliser un fichier file.pickle, je cherchais une approche plus compacte (pour distribuer le script plus facilement).

Existe-t-il un mécanisme permettant d'intégrer des données arbitraires dans un script python?

Répondre

3

Si les données ne sont pas particulièrement grande (beaucoup K) Je voudrais juste .encode ('base64') et l'inclure dans une chaîne entre guillemets, avec .decode ('base64') pour récupérer les données binaires, et un appel pickle.loads() autour de celui-ci

+0

Pourquoi base64 l'encoder quand pickle.dumps() renvoie ASCII par défaut déjà? –

+0

Lester, plusieurs raisons. Avez-vous essayé avec des données binaires? C'est beaucoup plus grand à cause de toutes les fuites. La routine Python 2.x str.encode() la formate également en lignes sympas pour vous, afin de garder le fichier source bien rangé. (Sous 3.x, vous ne pouvez pas encoder en base64 avec str.encode, mais il existe un module base64. On dirait que la bonne mise en forme nécessite un code personnalisé maintenant Notez que sous 3.x pickle.dumps() sort un octet tapez par défaut, pas de chaîne, mais ce n'est probablement pas un problème en soi.) –

+0

Assez juste - je serais trop préoccupé par la taille jusqu'à ce que je rencontre des problèmes de performance ;-) –

2

En Python, vous pouvez utiliser « » »(chaînes triples guillemets) à intégrer de longues séries de données texte dans votre programme.

Dans votre cas, cependant, ne perdez pas de temps à ce sujet.

Si vous avez un objet que vous avez marinées, vous seriez beaucoup, le dumping beaucoup plus heureux que l'objet en tant que source Python et incluant simplement la source.

la fonction repr, appliquée à la plupart des objets, émettra une source Python Si vous implémentez __repr__ pour toutes vos classes personnalisées, vous pouvez vider votre structu re comme source Python.

Si, d'autre part, la structure décapée a commencé comme code Python, il suffit de laisser comme code Python.

+0

clarifier trop à peu (je pense): il suffit de la méthode classe '__repr __()' émette le code source Python pour un appel valide '__init __ de la classe()' méthode qui reconstruira l'instance en cours d'enregistrement . – martineau

4

Avec le pickle, vous pouvez également travailler directement sur les cordes.

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

Si vous combinez cela avec « » »(chaînes triples guillemets), vous pouvez facilement stocker des données marinées dans votre fichier.

1

J'ai fait Vous lancez quelque chose comme python comp.py foofile.tar.gz, et il crée decomp.py, avec le contenu de foofile.tar.gz, je ne pense pas que ce soit vraiment portable avec Windows à cause du Popen cependant

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) 
+0

+1 Je crois que ce serait assez facile à convertir sur la plate-forme Windows. Bonne idée. – martineau

Questions connexes