解決 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 即可。

前註:

  1. 本文中所列的程式碼和 cx_Freeze 相同,採 Python License 授權。
  2. patch 作者稱該 patch 於 cx_Freeze 4.2.3、Python 3.2、Windows XP SP3 測試成功。若用其他版本測試的話,筆者不擔保其成功與否。
  3. 筆者恕不擔保使用該方法之任何風險和責任,但如本法有錯誤的話,敬請迴響指教。

解決方法:

  1. 若您已安裝 cx_Freeze,請先刪除之。建議使用 pip 這個套件移除,pip 的下載與使用說明請到該套件網站(英文)。
  2. 下載 cx_Freeze 4.2.3 的原始碼(下載點)。
  3. 解壓縮後,請進入 cx_Freeze-4.2.3\source\bases 目錄。
  4. 用編輯器打開 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"");
  1. 存檔離開編輯器後,打開命令提示字元,輸入:
    cd _目錄cx_Freeze-4.2.3的路徑_
    _Python的安裝路徑_\python setup.py install
    標_斜體_字處請依實際情況修改,如 Python 的安裝路徑改成 C:\Python32\Python
  2. 若出現 error: Unable to find vcvarsall.bat 的錯誤,請參解决“Unable to find vcvarsall.bat”錯誤(簡體中文),或類似文章解決。
  3. 重新執行將套件轉 .exe檔的 setup.py 。轉成的 .exe 檔就算放在中文路徑下,也能順利運作(當然前提是該套件沒有其他錯誤)。

上代 blog 的評論

發文時間統一採GMT+8

  1. 作者:thanks

    時間:2011-07-26 05:48:19

    內容:感恩, 很有用.