Seite 1 von 1

cx_Freeze Fehler mit Python 3.1 unter Windows XP

Verfasst: Samstag 8. Januar 2011, 10:42
von droptix
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

Re: cx_Freeze Fehler mit Python 3.1 unter Windows XP

Verfasst: Samstag 8. Januar 2011, 11:49
von b.esser-wisser
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

Re: cx_Freeze Fehler mit Python 3.1 unter Windows XP

Verfasst: Sonntag 9. Januar 2011, 11:25
von droptix
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?

Re: cx_Freeze Fehler mit Python 3.1 unter Windows XP

Verfasst: Sonntag 9. Januar 2011, 11:37
von Leonidas
In ``site-packages`` sind nachträglich installierte Module, in einer "frischen" Installation von Python ist dieser Ordner leer.

Re: cx_Freeze Fehler mit Python 3.1 unter Windows XP

Verfasst: Sonntag 9. Januar 2011, 11:40
von 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.

Re: cx_Freeze Fehler mit Python 3.1 unter Windows XP

Verfasst: Dienstag 11. Januar 2011, 16:44
von droptix
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

Re: cx_Freeze Fehler mit Python 3.1 unter Windows XP

Verfasst: Mittwoch 12. Januar 2011, 21:29
von droptix
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?