Seite 1 von 1

Probleme mit: pickle und py2exe

Verfasst: Sonntag 3. Juli 2005, 10:47
von Gast99
Hallo,

ich habe ein kleines Programm mit Python mit pickle geschrieben. Wenn ich es jetzt aber mit py2exe in eine exe datei umwandle klappt es nicht mehr. Wenn ich die exe-Datei öffne startet er kurz aber dann schließt er wieder das Fenster!

Kann mir einer Helfen?

mfg

Verfasst: Sonntag 3. Juli 2005, 11:04
von Gast99
Ich habs gerade nochma probiert.

Das Problem liegt irgentwie beim Laden von einer größeren Textdatei...

Verfasst: Sonntag 3. Juli 2005, 11:15
von Leonidas
Ja, klar. Ruf das Programm mal aus einer Konsole aus, so dass du die Fehlermeldung mitbekommst.

Ich bezweifle, dass das was mit pickle zu tun hat.

Verfasst: Sonntag 3. Juli 2005, 11:22
von Gast99
Der Fehler:

Traceback (most recent call last):
File "TEST123.py", line 11, in ?
File "pickle.pyc", line 1394, in loads
File "pickle.pyc", line 872, in load
File "pickle.pyc", line 984, in load_string
ValueError: insecure string pickle


--------------------------------------------------

line 11 von TEST123.py:
...
daten = pickle.loads( f.read() )
...

Verfasst: Sonntag 3. Juli 2005, 11:28
von tabellar
Gast99 hat geschrieben:Der Fehler:

Traceback (most recent call last):
File "TEST123.py", line 11, in ?
File "pickle.pyc", line 1394, in loads
File "pickle.pyc", line 872, in load
File "pickle.pyc", line 984, in load_string
ValueError: insecure string pickle
...
Die Zeile 984 ist interessant und wichtig... :wink: ...

Tabellar

Verfasst: Sonntag 3. Juli 2005, 11:32
von Gast99
tabellar hat geschrieben:
Gast99 hat geschrieben:Der Fehler:

Traceback (most recent call last):
File "TEST123.py", line 11, in ?
File "pickle.pyc", line 1394, in loads
File "pickle.pyc", line 872, in load
File "pickle.pyc", line 984, in load_string
ValueError: insecure string pickle
...
Die Zeile 984 ist interessant und wichtig... :wink: ...

Tabellar

Ja und was soll ich jetzt machen?!

Verfasst: Sonntag 3. Juli 2005, 11:37
von Leonidas
Wie wärs mit pickle.load(f)?

Verfasst: Sonntag 3. Juli 2005, 12:17
von Gast99
Leonidas hat geschrieben:Wie wärs mit pickle.load(f)?
Da kommt dieser Fehler:

Traceback (most recent call last):
File "TEST123.py", line 12, in ?
File "pickle.pyc", line 1390, in load
File "pickle.pyc", line 872, in load
File "pickle.pyc", line 985, in load_string
LookupError: no codec search functions registered: can't find encoding

Verfasst: Sonntag 3. Juli 2005, 12:33
von querdenker
Wie wäre es mit ein wenig mehr von deinem Programm-Code??
und eventuell auch mal deine setup.py?

Die Tracebacks kommen alle aus der pickle.pyc, aber die ruftst du ja auf in deiner test123.py, daher wäre es für uns schon hilfreich zu wissen, was du da machst.

mfg, querdenker

Verfasst: Sonntag 3. Juli 2005, 12:39
von Gast99
setup.py:

Code: Alles auswählen

from distutils.core import setup
import py2exe
      
setup(console=["Test123.py"])
in Test123.py wird Datei Files.txt geladen.

Code: Alles auswählen

import pickle

f=file("files.txt",'r')
daten = pickle.load(f)
f.close()
Dann wird die geladene Liste bearbeitet. Das heißt Sachen hinzufügen ect.


Am Ende wird dann:

Code: Alles auswählen

f=file("files.txt",'w')
f.write(pickle.dumps(daten))
f.close()
Edit (Leonidas): Code in Python-Tags gesetzt, bitte das das nächste mal selbst machen :evil:

Verfasst: Sonntag 3. Juli 2005, 12:52
von Leonidas
Versuchs mal damit:

Code: Alles auswählen

from distutils.core import setup
import py2exe

setup(console=["Test123.py"],
    options = {"py2exe": {"packages": ["encodings"]}}
)

Verfasst: Sonntag 3. Juli 2005, 13:30
von Gast99
Leonidas hat geschrieben:Versuchs mal damit:

Code: Alles auswählen

from distutils.core import setup
import py2exe

setup(console=["Test123.py"],
    options = {"py2exe": {"packages": ["encodings"]}}
)
Wow! Du bist echt gut :)
Es klappt, zumindest auf den ersten Blick. Ich schaus mir jetzt nochn bisschen genauer an.

DANKE!

Verfasst: Sonntag 3. Juli 2005, 13:34
von Leonidas
Gast99 hat geschrieben:Wow! Du bist echt gut :)
Danke 8)
Gast99 hat geschrieben:

Code: Alles auswählen

f=file("files.txt",'w')
f.write(pickle.dumps(daten))
f.close()
Ein Tipp noch: du kannst auch pickle.dump(data, f) nutzen um in die Datei zu schreiben.

Verfasst: Sonntag 3. Juli 2005, 23:23
von BlackJack
Und pickle Dateien bitte immer im Binärmodus mit 'rb' bzw. 'wb' öffnen.

Verfasst: Donnerstag 5. Januar 2006, 21:29
von Gast009
BlackJack hat geschrieben:Und pickle Dateien bitte immer im Binärmodus mit 'rb' bzw. 'wb' öffnen.
Was meinst du damit?

Verfasst: Donnerstag 5. Januar 2006, 21:33
von Leonidas
Gast009 hat geschrieben:Was meinst du damit?
Statt

Code: Alles auswählen

f = file('files.txt', 'r')
besser

Code: Alles auswählen

f = file('files.txt', 'rb')
und statt

Code: Alles auswählen

f = file('files.txt', 'w')
besser

Code: Alles auswählen

f = file('files.txt', 'wb')

Verfasst: Montag 9. Januar 2006, 11:56
von N317V
BlackJack hat geschrieben:Und pickle Dateien bitte immer im Binärmodus mit 'rb' bzw. 'wb' öffnen.
Wieso denn?

Verfasst: Montag 9. Januar 2006, 14:38
von Leonidas
N317V hat geschrieben:
BlackJack hat geschrieben:Und pickle Dateien bitte immer im Binärmodus mit 'rb' bzw. 'wb' öffnen.
Wieso denn?
Weil das auch im Protocoll 0 noch Binärdaten sind, deren Zeilenumbrüche sind immer so wie sie sind (ich weiß nicht ob es CRLF ist oder etwas anderes), wenn man die Zeilenumbrüche ändert funktionierts nicht mehr. Zumindest habe ich das mal irgendwo gelesen.

Verfasst: Donnerstag 12. Januar 2006, 17:33
von gAst005
Leonidas hat geschrieben:
Gast009 hat geschrieben:Was meinst du damit?
Statt

Code: Alles auswählen

f = file('files.txt', 'r')
besser

Code: Alles auswählen

f = file('files.txt', 'rb')
und statt

Code: Alles auswählen

f = file('files.txt', 'w')
besser

Code: Alles auswählen

f = file('files.txt', 'wb')
Wenn ich das aber so mache, dann meckert er bei der nächsten zeile "daten2 = pickle.loads( f.read() )" rum.

Mein Codeabschnitt:

Code: Alles auswählen

f=file("files2.txt",'rb')
daten2 = pickle.loads( f.read() )
f.close()
Folgender Fehler zeigt er an:
Traceback (most recent call last):
File "C:\xxy.py", line 43, in -toplevel-
daten2 = pickle.loads( f.read() )
File "C:\Python24\lib\pickle.py", line 1394, in loads
return Unpickler(file).load()
File "C:\Python24\lib\pickle.py", line 872, in load
dispatch[key](self)
File "C:\Python24\lib\pickle.py", line 980, in load_string
raise ValueError, "insecure string pickle"
ValueError: insecure string pickle

Verfasst: Donnerstag 12. Januar 2006, 18:04
von Leonidas
gAst005 hat geschrieben:Mein Codeabschnitt:

Code: Alles auswählen

f=file("files2.txt",'rb')
daten2 = pickle.loads( f.read() )
f.close()
Dafür hat pickle ja auch die load()-Funktion (ohne das s hintendran, welches auf String weist):

Code: Alles auswählen

f = file("files2.txt",'rb')
daten2 = pickle.load(f)
f.close()
(habe ich allerdings nicht getestet, nur schnell meine Erinnerung mit der Modul-Dokumentation verglichen)