Seite 1 von 2

Probleme mit cxfreeze und Python 3.1

Verfasst: Montag 18. Januar 2010, 17:48
von heiliga horsd
Hallo liebe Python-Gemeinschaft.

Ich hoffe dies ist das richtige Forum Forum für mein Anliegen, falls nicht möge man das mir bitte entschuldigen.
Die Forensuche hat auch meiner Meinung nach nichts dienliches hervor gebracht.

Seit nunmehr etwas mehr als einem Monat programmiere ich mit Python (v. 3.1) ein kleines Mathe-Programm. Alles läuft einwandfrei und ich würde es auch gerne meinen Freunden zur Verfügung stellen, was anfangs noch mit cxfreeze gut funktionierte, nachdem das Programm aber immer umfangreicher (für euch ist das Programm sicherlich überschaubar, für mich stellt es bereits eine große Errungenschaft dar) wurde, gibt mir cxfreeze immer Fehlermeldungen aus, mit denen ich nix anfangen kann. Auch die neueste Version von cxfreeze hat keine Besserung gebracht.

Ich wollte daher Fragen, ob ihr mir Alternativen oder Lösungswege aufzeigen könnt, die mir ermöglichen einfache .exe-Dateien zu erstellen, denn für manche meiner Freunde ist das installieren von Python selbst keine Alternative (Internet zu langsam, keine entsprechenden Rechte auf dem PC etc.).


Danke schonmal für alle Antworten!

Lg heiliga horsd


P.S.: Mein Programm ist nur Python 3.1-kompatibel, 2.xx macht Probleme.

Verfasst: Montag 18. Januar 2010, 17:53
von Masaru
Hi,

1.) Du könntest uns die cx_freeze Fehlermeldungen zeigen, vielleicht kann hier einer etwas mehr damit anfangen und Lösungen posten.

2.) Du könntest anstelle cx_freeze auch Py2Exeoder PyInstallerverwenden.

Auch wenn ich bei Punkt 2) letztere Variante bevorzuge und für (für Windows) am einfachsten zu handhaben finde, gibt es immer mit zunehmenden 3rd Party Libraryzuwachs Probleme beim Paketieren von Python (o. auch anderen Interpretierten Sprachen + Interpreter) Sourcen in Binary-Form.

>>Masaru<<

Verfasst: Montag 18. Januar 2010, 18:03
von heiliga horsd
Hallo Masaru,

erst einmal Danke für die Antwort. Natürlich bekommt ihr die Fehlermeldungen von cxfreeze wenn ihr sie wollt:
C:\Users\***\Desktop\Programm\Source>cxfreeze Programm.py
Traceback (most recent call last):
File "C:\Python31\Scripts\cxfreeze", line 5, in <module>
main()
File "C:\Python31\lib\site-packages\cx_Freeze\main.py", line 188, in main
freezer.Freeze()
File "C:\Python31\lib\site-packages\cx_Freeze\freezer.py", line 435, in Freeze

self._FreezeExecutable(executable)
File "C:\Python31\lib\site-packages\cx_Freeze\freezer.py", line 126, in _Freez
eExecutable
scriptModule = finder.IncludeFile(exe.script, exe.moduleName)
File "C:\Python31\lib\site-packages\cx_Freeze\finder.py", line 459, in Include
File
deferredImports)
File "C:\Python31\lib\site-packages\cx_Freeze\finder.py", line 310, in _LoadMo
dule
module.code = compile(codeString, path, "exec")
File "Programm.py", line 1
\ufeffimport time
^
SyntaxError: invalid character in identifier

C:\Users\***\Desktop\Programm\Source>
Mein Programm besitzt eine Datei, in der die ganzen Funktionen zur Berechnung sitzen, und ein Programm, welches das Menü etc. repräsentiert und die Funktionen korrekt aufruft.
Insgesamt sind folgende Module importiert:
decimal
time
os
locale

Das mit PyInstaller wäre (wenn es funktioniert) eine Möglichkeit, ich weiß leider nur nicht wirklich wie ich es installiere und anwende :oops:

Verfasst: Montag 18. Januar 2010, 18:19
von Leonidas
In deinem Script ist ganz am Anfang ein Byte-Order-Mark (\uEFFF), das musst du wohl entfernen.

Verfasst: Montag 18. Januar 2010, 18:23
von heiliga horsd
Erstmal Danke für deine Antwort.
Leider hilft mir da von dir geschirebene in keinster Weise weiter... :(

Der Anfang der beiden Dateien sieht so aus:
import time
from ProgrammFunctions import *


while True: #Endlosschleife, damit das Programm immer wieder von vorne anläuft
[...]
from decimal import *
#Funktionssammlung Decimal importieren
import time #noetig für den Timestamp
import os #noetig um an das Homeverzeichnis zu gelangen
import locale
locale.setlocale(locale.LC_ALL,'')
Fehler1 = "Eingegebener Wert negativ, Abbruch" #Fehlermeldung bei negativen Werten
[...]
Wo befindet sich dieses Byte-Order-Mark? Und wie kommt es dahin?

Verfasst: Montag 18. Januar 2010, 18:34
von Masaru
Kannst Du mal Deine Programm.py Datei uns über http://paste.pocoo.org zeigen?

- einfach auf http://paste.pocoo.org gehen
- dort den Inhalt Deiner .py file ins Textfeld hineinkopieren
- links unten im DropDown Menu "Python" auswählen
- [Paste] Button klicken
- und uns die Url hier posten, die dann in der Adressleiste Deines Browsers angezeigt wird

>>Masaru<<

Verfasst: Montag 18. Januar 2010, 18:45
von Leonidas
heiliga horsd hat geschrieben:Wo befindet sich dieses Byte-Order-Mark? Und wie kommt es dahin?
Es geht ganz vorne, in den ersten zwei Byte der Datei und wird von deinem Editor nicht angezeigt.

Und da hin kommt es, weil dein Editor es dort reingesetzt hat. Notepad tut sowas manchmal.

Verfasst: Montag 18. Januar 2010, 19:13
von heiliga horsd
@masaru:
http://paste.pocoo.org/show/166817/
Leonidas hat geschrieben:
heiliga horsd hat geschrieben:Wo befindet sich dieses Byte-Order-Mark? Und wie kommt es dahin?
Es geht ganz vorne, in den ersten zwei Byte der Datei und wird von deinem Editor nicht angezeigt.

Und da hin kommt es, weil dein Editor es dort reingesetzt hat. Notepad tut sowas manchmal.
Ich hab es eigentlich immer mit der IDLE von Python bearbeitet. Wie bekomme ich das jetzt wieder weg, weder Python IDLE, noch Editor zeigen es an!

edit:// Ich hab gegoogelt, Windows-Bordmittel helfen mir anscheinend nicht weiter, das Ubuntu will ich auch nicht extra starten. Ich zieh grad N++ und werde dann berichten, ob es funktioniert hat. Bis dahin schonmal Vielen Dank an alle, die mir geholfen haben!

Verfasst: Montag 18. Januar 2010, 19:28
von heiliga horsd
Alles funktioniert Wunderbar, Vielen Vielen Dank!!!!
Ich hätte jetzt nur noch eine kleine Frage:
Bei der Ausführung sieht das ganze mit den Umlauten etwas ungewöhnlich aus (ü => ?, ä => " etc.), wenn ich das ganz normal mit Python ausführe passt alles. Was mache ich da falsch?

Verfasst: Dienstag 19. Januar 2010, 10:50
von mkesper
heiliga horsd hat geschrieben:Bei der Ausführung sieht das ganze mit den Umlauten etwas ungewöhnlich aus (ü => ?, ä => " etc.), wenn ich das ganz normal mit Python ausführe passt alles. Was mache ich da falsch?
Die Windows-Kommandozeile kennt leider nur die Codepages 850 bzw. 437. D.h. du müsstest deine Ausgabe entsprechend kodieren. Alles was nicht in der Codepage drin ist kann nicht dargestellt werden und würde dann einen UnicodeError liefern.

Verfasst: Dienstag 19. Januar 2010, 17:59
von heiliga horsd
Ok erst einmal vielen Dank für deine Antwort!
Gibt es für mich irgendeine Möglichkeit, die Kodierung vor dem "freezen" ganz flott zu ändern, ohne wieder alles umschreiben zu müssen? Oder existiert da ein anderer Kniff?

Verfasst: Dienstag 19. Januar 2010, 18:14
von numerix
Masaru hat geschrieben:2.) Du könntest anstelle cx_freeze auch Py2Exeoder PyInstallerverwenden.
Wenn ich nichts übersehen habe, dann sind beide - im Unterschied zu cxfreeze (das ich aber noch nie verwendet habe) - noch nicht fit für Python 3.

Verfasst: Mittwoch 20. Januar 2010, 10:08
von Masaru
numerix hat geschrieben:
Masaru hat geschrieben:2.) Du könntest anstelle cx_freeze auch Py2Exeoder PyInstallerverwenden.
Wenn ich nichts übersehen habe, dann sind beide - im Unterschied zu cxfreeze (das ich aber noch nie verwendet habe) - noch nicht fit für Python 3.
Ups ... hast recht ... Frechheit. *hut zieh*

Verfasst: Mittwoch 20. Januar 2010, 18:14
von heiliga horsd
Weiß denn keiner, wie ich dir Kodierung "quick'n dirty" ändern kann, so dass alles korrekt von der Windows-Shell dargestellt werden kann?

Verfasst: Mittwoch 20. Januar 2010, 22:58
von Leonidas
Also Quick'n'Dirty könnt ich mir vorstellen dass das überschrieben von ``sys.stdout`` zum gewünschten Ergebnis führen könnte. Aber ich habe eine ziemliche Abneigung gegen offensichtlich schlechte Lösungen, daher mag ich dich jetzt nicht auf dumme Ideen bringen.

Verfasst: Donnerstag 21. Januar 2010, 15:17
von heiliga horsd
Gibt's denn keine alternative zu "Alle Umlaute im Quelltext editieren"?

Verfasst: Freitag 22. Januar 2010, 01:27
von Leonidas
Die saubere Alternative wäre alle Strings vor der Ausgabe in das richtige Encoding zu wandeln und dieses optimalerweise durch den User festlegbar zu machen.

Verfasst: Freitag 22. Januar 2010, 15:14
von heiliga horsd
Und wie mache ich das? (also mit Kodieren und auswählen lassen)

Verfasst: Freitag 22. Januar 2010, 15:22
von Leonidas
heiliga horsd hat geschrieben:Und wie mache ich das? (also mit Kodieren und auswählen lassen)
Also, sagen wir mal du hast foldenden Code:

Code: Alles auswählen

print u"Hallo Österreich"
dann wird der zu

Code: Alles auswählen

print u"Hallo Österreich".encode(user_encoding)
Und ``user_encoding`` muss dann entsprechend gesetzt werden. Das kann dann irgendeine Dropdown-Box in einer GUI sein, aber auch ein Kommandozeilenparameter oder was auch immer.

Verfasst: Freitag 22. Januar 2010, 15:33
von heiliga horsd
Achso, also gar nicht so wild - hat das u eine bedeutung für mich?