cPickle läuft under Windows, aber Linux nicht

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
theliquidwave
User
Beiträge: 221
Registriert: Sonntag 1. Juni 2008, 09:08

Hi Leute.

Ich habe einen eigenen CS:S Server auf dem ich Matties EventScripts 2.0 installiert habe. Dieses Plugin erlaubt mir, auf einem CS:S Server mit Python zu arbeiten. Das ganze hat etwas mit den Statistiken der Spieler zu tun. Das mal Vorweg :)

Als ich noch nicht soviel Ahnung von Python hatte, habe ich die Userstats sehr kompliziert gespeichert mit cPickle. Das ganze ist auf dem Root passiert (Linux Ubuntu 7.10), es hat auch immer wunderbar geklappt. Doch vor 2 Tagen habe ich angefangen, mein Stats-System neu zu schreiben um es schneller zu machen. Dazu habe ich dann die gespeicherte rank.db von meinem Server geladen (auf meinen Windows PC) und mit einem Konverter von mir Konvertiert, was das ganze in 2 Dateien aufteilte: rank.db und rankcounter.db
Wenn ich unter Windows nun mein Stats-System teste, funktioniert es mit der "konvertierten" cPickle Datenbank bestens - es läuft viel schneller als vorher und es gibt keinen einzigen Fehler.
Als ich dann alles andere soweit fertig hatte, habe ich das neue Script hochgeladen inklusive der neuen Datenbanken.

Doch dann musste ich feststellen, dass es beim Laden der Datei zu einem Fehler kommt:Bild
Ich verstehe überhaupt nicht, was der Fehler mit "ValueError: could not convert string to float" meint.

Die dazugehörige Funktion, die db-Funktion ist hier:

Code: Alles auswählen

def db(kommando, name, mdict = {}):
        rdict = {}
       
        if kommando == "dump":
                datei = open("%s/db/%s.db" % (es.getAddonPath("ccc"), name), "w")
                cPickle.dump(mdict, datei)
                datei.close()
               
                return 1
        else:
                if os.path.isfile("%s/db/%s.db" % (es.getAddonPath("ccc"), name)):
                        datei = open("%s/db/%s.db" % (es.getAddonPath("ccc"), name), "r")
                        rdict = cPickle.load(datei)
                        datei.close()
       
        return rdict
(Der Code ist richtig, alle anderen Scripts die Datenbanken verwenden funktionieren super damit.)

Ich hoffe ich habe mein Problem gut genug beschrieben :)
Vielleicht kann mir da ja einer helfen.

~ Chris
Grüßle.
rayo
User
Beiträge: 773
Registriert: Mittwoch 5. November 2003, 18:06
Wohnort: Schweiz
Kontaktdaten:

Hi

Hast du die Pickle-Datei auch vom Windows hochgeladen?

Weil im Windows solltest du die Datei mit "wb" und "rb" öffnen wegen den \n die sonst zu \r\n werden.

Gruss
BlackJack

Pickle-Dateien sind Binärdaten und sollten überall mit 'rb'/'wb' geöffnet werden.

@Chrisber: Die Funktion `db()` erledigt zwei unterschiedliche Aufgaben, also sollten das auch besser zwei verschiedene Funktionen sein.

Warum gibt der "dump"-Zweig eine 1 zurück!?

Das erzeugen des Dateinamens wird deutlich zu oft gemacht, und sollte mit `os.path.join()` statt Zeichenkettenformatierung geschehen.
theliquidwave
User
Beiträge: 221
Registriert: Sonntag 1. Juni 2008, 09:08

Hi.
Vielen Dank für die Tips.
Also ich habe die rank.db vom Linux geladen, nen Python Script geschrieben was die Datei mit cPickle einlist und ne neue daraus macht und anschließend speichert.
Ich habe die neue & alte rank.db nicht mit einem Editor oder sonstwas geöffnet.

@ BlackJack: Die Funktion gibt 1 zurück damit ich schauen kann, ob die Datei gespeichert wurde ;)
Die os.path.join-Funktion schaue ich mir gleich mal an.

EDIT: Ich habe eben mal unter Windows getestet, was passiert, wenn ich die rank.db mit "rb" öffne. Auf einmal kommt genau der gleiche Fehler wie beim Linux. Mache ich das "b" wieder weg, funktioniert es wieder einwandfrei :S

~ Chris
Grüßle.
audax
User
Beiträge: 830
Registriert: Mittwoch 19. Dezember 2007, 10:38

dann hat windows die Zeilenumbrüche zu \r\n gemacht.
Lösung:
Unter windows einmal(!) mit `r` einlesen und mit `wb` wieder speichern.
theliquidwave
User
Beiträge: 221
Registriert: Sonntag 1. Juni 2008, 09:08

Hi.
Da bin ich vor 30 Minuten auch drauf gekommen.
Danke, es läuft wieder n1.

Danke an alle :)

~ Chris
Grüßle.
BlackJack

@chrisber: Die Erklärung mit der 1 ist unsinnig. Was wird denn zurück gegeben wenn die Datei nicht geschrieben werden konnte? Für so etwas sind Ausnahmen da, mit denen man diese Fehlercodes loswerden will.
theliquidwave
User
Beiträge: 221
Registriert: Sonntag 1. Juni 2008, 09:08

Mhh,
stimmt.
Ich befasse mich halt noch nicht so lange mit Python und kenne mich nicht so aus. Wusste ich nicht ;)

~ Chris
Grüßle.
Antworten