由于py2exe和pyinstaller不支持Python3,cx_freeze成为了比较常用的替代品。但是cx_freeze在直接使用中会遇到一些问题。以下记录两条今天打包时遇到的问题和解决方法。

###AttributeError ‘module’ object has no attribute ‘_fix_up_module’错误

这是cx_freeze在Python3.4版本后使用会遇到的一个问题。根据StackOverflow上的问题,需要到此处下载打过补丁解决了这个问题的版本。

下载得到的是pip的wheel包,使用pip install cx_freeze-blahblah.whl来安装。Script目录下放置的cx_freeze是*nix风格的shebang脚本,自行调用Python执行即可。

###NameError: global name ‘__file__‘ is not defined 错误

脚本打包后由于不再是由Python解释脚本的形式运行,__file__变量会失去作用。此时具有类似效用的是sys.executable,同时可以利用sys.frozen属性来判断是打包的exe还是py脚本。需要使用类似以下的代码:

1
2
3
4
if hasattr(sys, 'frozen'):
me = sys.executable
else:
me = __file__