CxFreeze Python 编译错误
我正在尝试把我的Python 3.4脚本编译成一个可执行文件,这样方便分享给别人。我选择使用cxfreeze,因为它是少数支持Python 3的工具之一。不过,当我运行编译脚本的命令时,出现了以下错误:
Traceback (most recent call last):
File "C:\Python34\lib\site-packages\cx_Freeze\initscripts\Console.py", line 27
, in <module>
exec(code, m.__dict__)
File "C:\Users\kylec\Desktop\DataMotion\Python\MailChecker.py", line 1, in <mo
dule>
from tkinter import *
File "c:\Python\64-bit\3.4\lib\importlib\_bootstrap.py", line 2214, in _find_a
nd_load
File "c:\Python\64-bit\3.4\lib\importlib\_bootstrap.py", line 2203, in _find_a
nd_load_unlocked
File "c:\Python\64-bit\3.4\lib\importlib\_bootstrap.py", line 1191, in _load_u
nlocked
File "c:\Python\64-bit\3.4\lib\importlib\_bootstrap.py", line 1161, in _load_b
ackward_compatible
AttributeError: 'module' object has no attribute '_fix_up_module'
但是,我不太明白问题出在哪里,只知道它在抱怨说找不到_fix_up_module。
更新:
Traceback (most recent call last):
File "cxfreeze", line 5, in <module>
main()
File "C:\Python34\lib\site-packages\cx_Freeze\main.py", line 187, in main
silent = options.silent)
File "C:\Python34\lib\site-packages\cx_Freeze\freezer.py", line 130, in __init
__
for n in self._GetDefaultBinPathExcludes() + binPathExcludes]
File "C:\Python34\lib\site-packages\cx_Freeze\freezer.py", line 270, in _GetDe
faultBinPathExcludes
import cx_Freeze.util
ImportError: DLL load failed: %1 is not a valid Win32 application.
很多其他的问答建议使用32位版本的cxfreeze。但我下载的是这个:cx_Freeze‑4.3.3.win32‑py3.4.exe。
如果我使用64位的cxfreeze进行编译,就没有错误了。但是,生成的exe文件却无法运行。
3 个回答
补充一下@DigitalSage的回答(他的回答非常好!)
我发现Python 3.6和新版本的cxFreeze有些问题。
下载32位的Python 3.6,应该可以和最新版本的cxFreeze正常工作。
另外,建议你看看virtualenv,这个工具可以让你在电脑上创建多个不同的Python环境,方便你使用。这样可以避免使用PATH变量,防止你的安装出现问题。
有时候我需要使用旧版本的Python来保持兼容性,这样可以省去很多麻烦。
这个回答是关于在Windows 7 64位电脑上使用Python 3.4的。
在我的情况下,我的电脑上同时安装了32位和64位的Python和cx_Freeze。为了解决这个问题,我彻底卸载了cx_Freeze和Python,然后重新安装了这两个软件,确保下载和安装的是正确的64位版本。
在重新安装之前,我还安装了pywin32。我把它卸载了,但没有重新安装。我不知道这是否导致了我的问题(反正我现在也不需要它)。
感谢Thomas K的辛勤工作和及时的回复,我们终于找到了问题所在。确实,我需要一个和我的Python安装版本匹配的64位cxfreeze。为了让Tkinter的图形界面正常工作,如果你还没有的话,需要在你的Python文件底部添加
root.mainloop()
这段代码。