Hi Phyton Leutz,
ich möchte das/die "pickle"-Protokoll(e) von Phyton gerne mit PHP nutzen können, damit man z.B: zwischen den beiden Programmiersprachen besser kommunizieren kann. Nur leider finde ich nirgends eine ausführliche Definition der Protokolle
Das einzige was ich neben der API gefunden habe ist das hier:
http://pickle-js.googlecode.com
ist aber halt nicht komplett.
Könnt Ihr mir da weiterhelfen ?
Ausfürliche Definition der pickle Protokolle
- cofi
- Python-Forum Veteran
- Beiträge: 4432
- Registriert: Sonntag 30. März 2008, 04:16
- Wohnort: RGFybXN0YWR0
Der Quelltext von ``pickle`` sollte helfen
Aber bei deinem Problem bietet sich eigentlich eher JSON an. Dafuer sollte es eigentlich auch PHP Libs geben. Auch wenn ich nicht verstehe warum man PHP nutzen sollte, wenn man Python haben kann...
Aber bei deinem Problem bietet sich eigentlich eher JSON an. Dafuer sollte es eigentlich auch PHP Libs geben. Auch wenn ich nicht verstehe warum man PHP nutzen sollte, wenn man Python haben kann...
*G* Genau darauf habe ich gewartet, aber egalAuch wenn ich nicht verstehe warum man PHP nutzen sollte, wenn man Python haben kann...
Ja klar gibt es, aber nicht alle Datentypen werden dann sauber übersetzt und zudem verliert man auch noch alle Referenzen, was sich bei größeren Datenmengen schon bemerkbar macht.Aber bei deinem Problem bietet sich eigentlich eher JSON an. Dafuer sollte es eigentlich auch PHP Libs geben.
- DatenMetzgerX
- User
- Beiträge: 398
- Registriert: Freitag 28. April 2006, 06:28
- Wohnort: Zürich Seebach (CH)
Du kannst eigene serialisierer / deserialisierer programmieren, dann können die "referenzen" ( die eh by Value sind) nicht verloren.
- Defnull
- User
- Beiträge: 778
- Registriert: Donnerstag 18. Juni 2009, 22:09
- Wohnort: Göttingen
- Kontaktdaten:
Nimm Json. Für beide Sprachen gibt es da Packete für.
Bottle: Micro Web Framework + Development Blog
Das wurde schon erwähnt ... und es wurde auch schon gesagt, warum das für den OP nicht unbedingt sinnvoll ist.Defnull hat geschrieben:Nimm Json. Für beide Sprachen gibt es da Packete für.
- Defnull
- User
- Beiträge: 778
- Registriert: Donnerstag 18. Juni 2009, 22:09
- Wohnort: Göttingen
- Kontaktdaten:
Sorry, es ist ja noch früh *hust*
Bottle: Micro Web Framework + Development Blog
Im Paket gnosis gibt das Modul xml.pickle
http://pypi.python.org/pypi/Gnosis%20Utilities/1.2.1
Wird z.B. von Pyro als Alternative zu pickle verwendet. Vielleicht wär das ja was für dich, wenn man das erzeugte XML in PHP einfach parsen kann.
http://pypi.python.org/pypi/Gnosis%20Utilities/1.2.1
Wird z.B. von Pyro als Alternative zu pickle verwendet. Vielleicht wär das ja was für dich, wenn man das erzeugte XML in PHP einfach parsen kann.
-
- Python-Forum Veteran
- Beiträge: 16025
- Registriert: Freitag 20. Juni 2003, 16:30
- Kontaktdaten:
Oder man koennte die Pickle-Stacksprache in PHP implementieren. Wobei ich mir nicht sicher bin, ob mitsuhiko nicht genau das schon früher mal gemacht hat.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
- Hyperion
- Moderator
- Beiträge: 7478
- Registriert: Freitag 4. August 2006, 14:56
- Wohnort: Hamburg
- Kontaktdaten:
Wo genau liegt das Problem mit Referenzen? Kannst Du da mal ein Beispiel geben? Würde mich mal interessieren, wie man das ggf. in JSON doch handeln kann.
Alleine die Größe kann's ja nicht sein, denn man sollte JSON gut zippen können.
Alleine die Größe kann's ja nicht sein, denn man sollte JSON gut zippen können.
- birkenfeld
- Python-Forum Veteran
- Beiträge: 1603
- Registriert: Montag 20. März 2006, 15:29
- Wohnort: Die aufstrebende Universitätsstadt bei München
Pakete, bitte.Defnull hat geschrieben:Nimm Json. Für beide Sprachen gibt es da Packete für.
Und @OP: wenn du dir zutraust, pickle in PHP zu implementieren, solltest du dir auch zutrauen, die Protokolldefinition aus pickle.py zu holen
Jede zyklische Datenstruktur kann man nicht einfach so serialisieren. Das betrifft beispielsweise doppelt verkettete Listen oder Bäume der Art Vater->Kinder, Kind->Vater. Da jedes Element auch wieder eine Referenz auf seinen Vorgänger hat, kann ein "dummer" Serialisierungsversuch gar nicht terminieren.Hyperion hat geschrieben:Wo genau liegt das Problem mit Referenzen? Kannst Du da mal ein Beispiel geben?
Um solche Datenstrukturen zu serialisieren, muss man die Zyklen entweder manuell lösen (in dem man z.B. im Baum alle Referenzen auf das Vater-Element nullt) oder eben ein Serialisierungsformat entwickeln, welches Referenzen hat.
@Hyperion: Auch Strukturen ohne Zyklen können Probleme bereiten, weil Referenzen durch das serialisieren nach JSON verloren gehen, und damit verhalten sich die Ergebnisse anders:
Code: Alles auswählen
In [3]: a = [1, 2]
In [4]: b = [a, a]
In [5]: b
Out[5]: [[1, 2], [1, 2]]
In [6]: c = pickle.loads(pickle.dumps(b))
In [7]: c
Out[7]: [[1, 2], [1, 2]]
In [8]: c[0][1] = 42
In [9]: c
Out[9]: [[1, 42], [1, 42]]
In [10]: c = simplejson.loads(simplejson.dumps(b))
In [11]: c
Out[11]: [[1, 2], [1, 2]]
In [12]: c[0][1] = 42
In [13]: c
Out[13]: [[1, 42], [1, 2]]
Wenn es keine Doku dazu gibt werde ich das wohl machen müssen. Mal gucken wie ich mich beim lesen von Python so anstelle.Und @OP: wenn du dir zutraust, pickle in PHP zu implementieren, solltest du dir auch zutrauen, die Protokolldefinition aus pickle.py zu holen Smile
-> Wenn das soweit funktioniert stell ich das hier wieder rein.
JSON ist gar keine so dumme Idee aber knapp vorbei ist auch vorbei.
Code: Alles auswählen
>> import yaml
>> a = [1, 2]
>> b = [a, a]
>> b
> [[1, 2], [1, 2]]
>> c = yaml.load(yaml.dump(b))
>> c
> [[1, 2], [1, 2]]
>> c[0][1] = 42
>> c
> [[1, 42], [1, 42]]
>> print yaml.dump(b)
- &id001 [1, 2]
- *id001
Es hat ungefähr 15 Minuten gedauert, einen eigenen Serializer zu bauen, der so einfach ist, dass man sicherlich auch ein PHP-Gegenstück bauen kann und der dies kann:
Das { steht für dict, ( für tuple, I für int und S für str. Danach kommen jeweils die Daten. Sequenzen werden mit ; beendet. Das R ist eine Referenz, damit rekursive Datenstrukturen funktionieren. Der Encoder hat 21 Zeilen, der Decoder 26.
http://gist.github.com/151889
Stefan
Code: Alles auswählen
>>> d = {1: "zwei", 3: [True]}; d[3].append(d)
>>> Serializer().write(d)
"{(I1S'zwei';(I3[TR0;;;"
http://gist.github.com/151889
Stefan
- birkenfeld
- Python-Forum Veteran
- Beiträge: 1603
- Registriert: Montag 20. März 2006, 15:29
- Wohnort: Die aufstrebende Universitätsstadt bei München
Sieht nett aus!
Zwei Anmerkungen: Strings mit Single-Quotes und negative Integers mag das Ding nicht, und das Slicing von m.group() könnte man vermeiden, wenn man die Gruppen in der Regex auf den eigentlichen Wert einschränkt. Ach ja, und es dürfte schneller sein, den String nicht nach jedem Match zu slicen, sondern einfach einen Startindex i zu inkrementieren und ihn re.match mitzugeben (dafür braucht es aber ein regex-Objekt).
Zwei Anmerkungen: Strings mit Single-Quotes und negative Integers mag das Ding nicht, und das Slicing von m.group() könnte man vermeiden, wenn man die Gruppen in der Regex auf den eigentlichen Wert einschränkt. Ach ja, und es dürfte schneller sein, den String nicht nach jedem Match zu slicen, sondern einfach einen Startindex i zu inkrementieren und ihn re.match mitzugeben (dafür braucht es aber ein regex-Objekt).
Hatte nicht bedacht, dass `repr()`von ' auf " wechselt, wenn ein ' im String vorkommt. Das und negative Zahlen werden jetzt erkannt. Für Strings ist der reguläre Ausdruck allerdings immer noch zu trivial, denn er erkennt keine \. Das überlasse ich dem Leser als Übung.
Ansonsten habe ich nach birkenfelds Blick den Code nochmals geändert, weil mir doch 40 Zeilen für den Decoder einfach zu viel waren. Auf Effizienz hatte ich zwar überhaupt nicht geachtet, aber ich denke, das neue Verfahren würde besser performen, wenn einem das wichtig wäre.
Stefan
Ansonsten habe ich nach birkenfelds Blick den Code nochmals geändert, weil mir doch 40 Zeilen für den Decoder einfach zu viel waren. Auf Effizienz hatte ich zwar überhaupt nicht geachtet, aber ich denke, das neue Verfahren würde besser performen, wenn einem das wichtig wäre.
Stefan
- birkenfeld
- Python-Forum Veteran
- Beiträge: 1603
- Registriert: Montag 20. März 2006, 15:29
- Wohnort: Die aufstrebende Universitätsstadt bei München
LOC durch 1-Zeilen-Suiten zu sparen, ist natürlich keine Kunst