cx_Freeze Fehler mit Python 3.1 unter Windows XP

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
droptix
User
Beiträge: 521
Registriert: Donnerstag 13. Oktober 2005, 21:27

Ich nutze Python 3.1 unter Windows XP (SP3, Version 5.1.2600) und möchte eine .exe Datei mit cx_Freeze erzeugen, da py2exe leider nicht mit Python 3.1 funktioniert.

Kurzum: Egal was ich probiere, ich erhalte immer den Fehler struct.error: required argument is not an integer.

Ich vermute einen Bug in cx_Freeze, kann das jemand bestätigen oder mache ich was falsch? Einfacher als dieses Beispiel geht es kaum, das wird so auch in jedem Tutorial beschrieben... (Edit: Wie soeben getestet passiert das auch bei den von cx_Freeze mitgelieferten Beispielen unter C:\Python31\Lib\site-packages\cx_Freeze\samples\simple etc.).

Mein Programm:

Code: Alles auswählen

print("Hello World!")
Das cx_Freeze Setup:

Code: Alles auswählen

from cx_Freeze import setup, Executable

setup(
    name = "My Program",
    description = "A simple Hello World program.",
    version = "0.1",
    executables = [Executable("program.py")]
)
Der Setup-Aufruf:

Code: Alles auswählen

C:\Python31\python.exe setup.py build
Der Fehler:

Code: Alles auswählen

running build
running build_exe
creating directory build\exe.win32-3.1
copying C:\Python31\lib\site-packages\cx_Freeze\bases\Console.exe -> build\exe.w
in32-3.1\program.exe
copying C:\WINDOWS\system32\python31.dll -> build\exe.win32-3.1\python31.dll
Traceback (most recent call last):
  File "setup.py", line 13, in <module>
    executables = [Executable("program.py")]
  File "C:\Python31\lib\site-packages\cx_Freeze\dist.py", line 359, in setup
    distutils.core.setup(**attrs)
  File "C:\Python31\lib\distutils\core.py", line 149, in setup
    dist.run_commands()
  File "C:\Python31\lib\distutils\dist.py", line 919, in run_commands
    self.run_command(cmd)
  File "C:\Python31\lib\distutils\dist.py", line 938, in run_command
    cmd_obj.run()
  File "C:\Python31\lib\distutils\command\build.py", line 128, in run
    self.run_command(cmd_name)
  File "C:\Python31\lib\distutils\cmd.py", line 315, in run_command
    self.distribution.run_command(command)
  File "C:\Python31\lib\distutils\dist.py", line 938, in run_command
    cmd_obj.run()
  File "C:\Python31\lib\site-packages\cx_Freeze\dist.py", line 231, in run
    freezer.Freeze()
  File "C:\Python31\lib\site-packages\cx_Freeze\freezer.py", line 470, in Freeze

    self._FreezeExecutable(executable)
  File "C:\Python31\lib\site-packages\cx_Freeze\freezer.py", line 160, in _Freez
eExecutable
    self._AddVersionResource(exe.targetName)
  File "C:\Python31\lib\site-packages\cx_Freeze\freezer.py", line 105, in _AddVe
rsionResource
    stamp(fileName, versionInfo)
  File "C:\Python31\lib\site-packages\win32\lib\win32verstamp.py", line 157, in
stamp
    vs = VS_VERSION_INFO(vmaj, vmin, vsub, vbuild, sdata, vdata, is_debug, is_dl
l)
  File "C:\Python31\lib\site-packages\win32\lib\win32verstamp.py", line 105, in
VS_VERSION_INFO
    result = pad32(result) + StringFileInfo(sdata) + VarFileInfo(vdata)
  File "C:\Python31\lib\site-packages\win32\lib\win32verstamp.py", line 83, in S
tringFileInfo
    result = pad32(result) + StringTable('040904E4', data)
  File "C:\Python31\lib\site-packages\win32\lib\win32verstamp.py", line 75, in S
tringTable
    result = result + String(k, v)
  File "C:\Python31\lib\site-packages\win32\lib\win32verstamp.py", line 65, in S
tring
    result = struct.pack('hh', len(value)/2, 1) # wValueLength, wType
struct.error: required argument is not an integer
Benutzeravatar
b.esser-wisser
User
Beiträge: 272
Registriert: Freitag 20. Februar 2009, 14:21
Wohnort: Bundeshauptstadt B.

Der Fehler scheint ja in der vorletzten Zeile des tracebacks zu stehen: 'int() / int() ' liefert in Python 3.x ein float(). Als patch solltest du da aus dem "/" ein "//" machen können (und den Bug natürlich melden).

hth, Jörg
droptix
User
Beiträge: 521
Registriert: Donnerstag 13. Oktober 2005, 21:27

b.esser-wisser hat geschrieben:Als patch solltest du da aus dem "/" ein "//" machen
Hallo Jörg, meinst du das so?

Code: Alles auswählen

result = struct.pack('hh', len(value)//2, 1)
Ist das neu in Python 3.1 und was bewirkt das?

Bug hab ich soeben über die cx_Freeze Mailinglist gemeldet...

Der Fehler tritt ja in C:\Python31\lib\site-packages\win32\lib\win32verstamp.py auf. Gehört das zur Standardausstattung von Python 3.1 oder sind das meine nachträglich installierten win32 Module für Python?
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

In ``site-packages`` sind nachträglich installierte Module, in einer "frischen" Installation von Python ist dieser Ordner leer.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
BlackJack

@droptix: Der ``//``-Operator ist nicht neu. Einfach mal in der Dokumentation zu den numerischen Grundtypen zur Tabelle mit den Operatoren runterscrollen. Neu in Python 3.x ist, dass der ``/``-Operator auch bei ganzzahligen Operanden eine echte Division durchführt und dabei eine Fliesskommazahl als Ergebnis heraus kommen kann.
droptix
User
Beiträge: 521
Registriert: Donnerstag 13. Oktober 2005, 21:27

Es handelt sich tatsächlich um einen bestätigten Bug, wie ich aus der Mailingliste erfahren habe:

http://pywin32.cvs.sourceforge.net/view ... 1.5&r2=1.6
droptix
User
Beiträge: 521
Registriert: Donnerstag 13. Oktober 2005, 21:27

Hat funktioniert, prima soweit.

Mein Ziel ist es, eine einzige .exe Datei zu erzeugen, die alle Bibliotheken (z.B. python31.dll) bereits enthält, so wie man das in py2exe machen kann. Ich kriege das mit cx_Freeze nicht hin, habe aus der Dokumentation einige Einstellungen probiert, aber ehrlich gesagt fehlt sowas wie py2exe's `bundle_files=1` (bundle everything, including the Python interpreter).

Google liefert mir ebenfalls kein Ergebnis, nur für py2exe.

Hat das jemand mit cx_Freeze schonmal gemacht. Irgendwelche Tipps für mich?
Antworten