解決 cx_Freeze 做出的 .exe 檔無法在中文路徑下執行的問題
目錄
最近因為協助 Lonote 筆記軟體在 Windows 下的打包工作中,因為 Py2exe 至今對這軟體使用的 Python3 不支援,所以採用 cx_Freeze 將用 Python3 寫成的程式和相依的函式庫綁在同一個資料夾中,以方便廣大沒有安裝 Python3 和 PyQt4 的 Windows 用者使用。
但對於中文使用者來說, cx_Freeze 有相當嚴重的缺點,那就是在 setup.py 中,若 cx_Freeze.Executable 之 Base = ‘Win32GUI’(該參數的值為 ‘Win32GUI’ 時),做出來的視窗程式 .exe 檔無法在含有中文名稱的路徑下執行。若嘗試執行,則會跳出 “cannot get zipimporter instance” 的警告視窗。目前的正式版本 4.2.3 仍舊會出現這個錯誤。
慶幸網友 Kder 寫了一個 patch ,修正了這個 bug。因為該 patch 相當簡單,含空白只有5行,故可以不用另外下載 patch 程式補上,直接如下法手動修改、編譯、重裝 cx_Freeze 即可。
前註:
- 本文中所列的程式碼和 cx_Freeze 相同,採 Python License 授權。
- patch 作者稱該 patch 於 cx_Freeze 4.2.3、Python 3.2、Windows XP SP3 測試成功。若用其他版本測試的話,筆者不擔保其成功與否。
- 筆者恕不擔保使用該方法之任何風險和責任,但如本法有錯誤的話,敬請迴響指教。
解決方法:
- 若您已安裝 cx_Freeze,請先刪除之。建議使用 pip 這個套件移除,pip 的下載與使用說明請到該套件網站(英文)。
- 下載 cx_Freeze 4.2.3 的原始碼(下載點)。
- 解壓縮後,請進入 cx_Freeze-4.2.3\source\bases 目錄。
- 用編輯器打開 Win32GUI.c ,在第 6, 7 行間插入 **
#include <locale.h>
**,變成#include <Python.h> #include <locale.h>
#include <windows.h>
5. 在第 266, 267 行間插入 setlocale(LC_CTYPE, "");
,變成:
#if PY_MAJOR_VERSION >= 3 setlocale(LC_CTYPE, ""); Py_SetPythonHome(L"");
- 存檔離開編輯器後,打開命令提示字元,輸入:
cd _目錄cx_Freeze-4.2.3的路徑_ _Python的安裝路徑_\python setup.py install
標_斜體_字處請依實際情況修改,如 Python 的安裝路徑改成C:\Python32\Python
。 - 若出現
error: Unable to find vcvarsall.bat
的錯誤,請參解决“Unable to find vcvarsall.bat”錯誤(簡體中文),或類似文章解決。 - 重新執行將套件轉 .exe檔的 setup.py 。轉成的 .exe 檔就算放在中文路徑下,也能順利運作(當然前提是該套件沒有其他錯誤)。
上代 blog 的評論
發文時間統一採GMT+8
作者:thanks
時間:2011-07-26 05:48:19
內容:感恩, 很有用.