pickle und exec ".." in ..

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
pizzabaecker
User
Beiträge: 6
Registriert: Freitag 5. August 2005, 23:24

Hi !

mit dem befehl "exec" kann ich ja befehle usw. ausführen lassen, und das in einer quasi völlig eigenständigen umgebung, da alle variablen in einem dictionary gespeichert werden, bspw:

Code: Alles auswählen

execvariablen = {}
exec "a = 5" in execvariablen
exec "print a" in execvariablen
nun ist die variable a nur innerhalb des exec-befehls sichtbar, und alle variablen, die man innerhalb des exec-befehls benutzt, sind in execvariablen gespeichert.
Nun meine Frage, wie speichere ich execvariablen mit pickle in einer datei ?
denn dann hätte ich auf einen schlag ne ganze python"umgebung" gespeichert.

thx schonmal für die hilfe !

-edit-: es muss natürlich nicht mit pickle sein, hauptsache, dieses execvariablen ist speicher- und wiederherstellbar

Edit (Leonidas): Code in Python-Tags gesetzt.
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Hättest du nach pickle gesucht, würdest du bestimmt auf ein Beispiel landen... Aber gut:

Code: Alles auswählen

import pickle

f=file( "daten.dat", 'wb' )
f.write( pickle.dumps(execvariablen, protocol=2) )
f.close()

Code: Alles auswählen

import pickle

f=file( "daten.dat", 'rb' )
execvariablen = pickle.loads( f.read() )
f.close()
Und wenn's große Datenmengen sind nim cPickle

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
pizzabaecker
User
Beiträge: 6
Registriert: Freitag 5. August 2005, 23:24

ich habe schon im forum gesucht, und ich weiß auch eigentlich, wie man mit pickle umgeht, aber wenn ich versuche pickle auf diese variable execvariablen anzuwenden kommt folgender fehler :

Code: Alles auswählen

    raise TypeError, "can't pickle %s objects" % base.__name__
TypeError: can't pickle ellipsis objects
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Nicht alle Objekte können mit pickle serialisiert werden, zum Beipsiel Dateien und Sockets gehen nicht. Was hast du für Dateien in execfiles?
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
pizzabaecker
User
Beiträge: 6
Registriert: Freitag 5. August 2005, 23:24

wie oben beschrieben, execvariablen ist die umgebung von dem exec-befehl.

ich weiß, dass pickle nicht alle objekte speichern kann (code objekte z.B.nur über nen umweg glaub ich), gibt es denn eine andre möglichkeit, die jedes objekt/jede variable speichern kann?
pizzabaecker
User
Beiträge: 6
Registriert: Freitag 5. August 2005, 23:24

super, mit syck funktioniert s ^^ jetzt kann ich ganze python umgebungen auf einen schlag abspeichern.
danke nochmal !

-edit-: mmhm, irgendwas klappt uach mit syck noch nicht ganz, es wird nicht wieder richtig zurück geladen .. falls jemand noch ne alternative zu syck/marshal/pickle kenn, wär das super !
BlackJack

Wahrscheinlich hätte es auch gereicht die '__builtins__' vor dem picklen aus dem Dictionary zu entfernen.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

pizzabaecker hat geschrieben:falls jemand noch ne alternative zu syck/marshal/pickle kenn, wär das super !
Ich würde ja erstmal BlackJacks Tipp ausprobieren haber hier mal paar Alternativen: XMarshaL, PyXO, gnosis-xml, PyXML (soweit ich weiß auch PyXML)...
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
pizzabaecker
User
Beiträge: 6
Registriert: Freitag 5. August 2005, 23:24

tut mir leid, ich weiß noch nicht soo viel von python.
was ist mit den "__builtins__" gemeint ?
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Die Python Builtins, das sind die Befehle die du direkt im Programm benutzen kannst, ohne sie importiert zu haben. Eines davon ist zum Beispiel reversed(). DIese findest zu mit dir(__builtins__).

Aber poste doch einfach mal deinen Code (die du verscuht hast und was nicht geht), dann können wir dir sicher viel besser helfen.

Du hast Syck benutzt um deine gesamte Umgebung in eine YAML-Datei zu schreiben?
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
pizzabaecker
User
Beiträge: 6
Registriert: Freitag 5. August 2005, 23:24

also, ich benutze im moment syck (und damit verbunden ydump), hier mal ein funktionierendes beispiel :

Code: Alles auswählen

import syck,ydump

execvar = {}
exec "a = 5" in execvar
exec "print a" in execvar
gedumpt = ydump.dump(execvar)
execvar = {}
execvar = syck.load(gedumpt)
exec "print a" in execvar
das funktioniert, ich kann execvar dumpen und wieder laden, die ausgabe ist 2 mal "5".
aber folgendes funktioniert wiederum nicht:

Code: Alles auswählen

import syck,ydump
execvar = {}
exec """class myclass:
	def hallo(self):
		print 'hallo'
""" in execvar
exec "myclassobject = myclass()" in execvar
exec "myclassobject.hallo()" in execvar
gedumpt = ydump.dump(execvar)
execvar = {}
execvar = syck.load(gedumpt)
exec "myclassobject.hallo()" in execvar
ausgabe ist folgende :
>>> execfile("picklepython.py")
hallo
Traceback (most recent call last):
File "<stdin>", line 1, in ?
File "picklepython.py", line 13, in ?
exec "myclassobject.hallo()" in execvar
File "<string>", line 1, in ?
AttributeError: 'dict' object has no attribute 'hallo'
in execvar befindet sich die gesamte "umgebung" (also alle variablen/objekte usw.) des benutzten exec-befehls, und dieses execvar will ich speichern können.

ich hoffe jetzt ist es verständlicher, was ich machen will.
danke noch für die ganzen antworten !

--edit--: ok, ich hab mal ausprobiert, auch objekte, die nicht in der exec-umgebung erstellt wurden, zu dumpen, sobald s ne benutzerdefinierte klasse ist, funktioniert s nicht mehr .. son mist
BlackJack

pizzabaecker hat geschrieben:--edit--: ok, ich hab mal ausprobiert, auch objekte, die nicht in der exec-umgebung erstellt wurden, zu dumpen, sobald s ne benutzerdefinierte klasse ist, funktioniert s nicht mehr .. son mist
Das steht zumindest bei `pickle` auch irgendwo in der Doku. Die ganzen Lösungen erlauben es Daten zu speichern und zwar plattformübergreifend. Das geht mit Code aber nicht. Man kann zum Beispiel gepickelte Daten von CPython in Jython laden und umgekehrt. Das ginge nicht mehr, wenn man auch Code-Objekte wie Klassen oder Funktionen speichern könnte.
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

@pizzabaecker: Du versuchst anscheinend sowas wie eine Sandbox zu bauen, oder? IMHO klappt das aber so nicht, zumindest ist das nicht wirklich "sicher"...

Alternativ zu pickle könnte man versuchen alle "Daten" per Hand in eine Datei zu speichern...

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Benutzeravatar
nkoehring
User
Beiträge: 543
Registriert: Mittwoch 7. Februar 2007, 17:37
Wohnort: naehe Halle/Saale
Kontaktdaten:

mal zu pickle: inwiefern kann man mit pickle denn daten serialisieren? kann man da soweit gehen wie in c, wenn man datensaetze ueber strukturen castet? ich wuerde naemlich gern ein binaerformat auslesen... auch wenn es mit C oder sowas gemacht wurde.
[url=http://www.python-forum.de/post-86552.html]~ Wahnsinn ist auch nur eine andere Form der Intelligenz ~[/url]
hackerkey://v4sw6CYUShw5pr7Uck3ma3/4u7LNw2/3TXGm5l6+GSOarch/i2e6+t2b9GOen7g5RAPa2XsMr2
Benutzeravatar
mq
User
Beiträge: 124
Registriert: Samstag 1. Januar 2005, 19:14

nkoehring hat geschrieben:mal zu pickle: inwiefern kann man mit pickle denn daten serialisieren? kann man da soweit gehen wie in c, wenn man datensaetze ueber strukturen castet? ich wuerde naemlich gern ein binaerformat auslesen... auch wenn es mit C oder sowas gemacht wurde.
Nein, pickle hat ein eigenes Format. Wenn du Binaerdaten lesen willst, solltest du dir mal das Modul struct angucken.

Oh, und es waere nett, wenn du dafuer nicht einen anderhalb Jahre alten Thread hochholen wuerdest. Einen neuen aufmachen ist uebersichtlicher :)
Benutzeravatar
nkoehring
User
Beiträge: 543
Registriert: Mittwoch 7. Februar 2007, 17:37
Wohnort: naehe Halle/Saale
Kontaktdaten:

lumax hat geschrieben:
nkoehring hat geschrieben:mal zu pickle: inwiefern kann man mit pickle denn daten serialisieren? kann man da soweit gehen wie in c, wenn man datensaetze ueber strukturen castet? ich wuerde naemlich gern ein binaerformat auslesen... auch wenn es mit C oder sowas gemacht wurde.
Nein, pickle hat ein eigenes Format. Wenn du Binaerdaten lesen willst, solltest du dir mal das Modul struct angucken.
Ah danke... das werd ich gleich mal tun...
lumax hat geschrieben: Oh, und es waere nett, wenn du dafuer nicht einen anderhalb Jahre alten Thread hochholen wuerdest. Einen neuen aufmachen ist uebersichtlicher :)
Ja du hast recht... aber daran hatte ich erst gedacht, als es schon zu spaet war *hihi* :lol:
[url=http://www.python-forum.de/post-86552.html]~ Wahnsinn ist auch nur eine andere Form der Intelligenz ~[/url]
hackerkey://v4sw6CYUShw5pr7Uck3ma3/4u7LNw2/3TXGm5l6+GSOarch/i2e6+t2b9GOen7g5RAPa2XsMr2
Antworten