Python 使用 cx_freeze 來打包 PyQt 套件

我們之前已經使用 Py2exe、Pyinstaller 等套件來打包 PyQt 變成 exe 執行檔,其實 Python 還有另一個套件稱為 cx_freeze ,既然先前的方式都成功了,這次我們也不例外就使用 cx_freeze 來玩玩打包 PyQt 變成 exe。以下的範例是使用 python 3.1 來執行,不過實際測試過 python 2.7 一樣也能執行。
將python打包成exe的程序有很多,比如py2exe、PyInstaller等等,但是到目前為止,它們對python3.1支持的都不好,所以這裡我要介紹一下cx_freeze 4.2.2,它還能支持跨平台,可以在windows和linux運行。

cx_freeze的下載網址為 http://sourceforge.net/projects/cx-freeze/files/ ,要根據已安裝的python版本進行選擇。比如我使用的是python3.1,所以就要下載cx_Freeze-4.2.2.win32-py3.1.msi這個文件。運行這個安裝包後,相關程序就會被拷貝到python的目錄下。主要在兩個地方,一個是C:/Python31/Scripts,另一個是C:/Python31/Lib/site-packages/cx_Freeze



在以前版本的cx_Freeze中,是通過FreezePython.py這個腳本將py轉換為exe,而在4.2.2這個版本中,FreezePython.py已經不見了,主要的工作交給了C:/Python31/Scripts下的cxfreeze.bat來完成。

使用cx_Freeze完成python打包exe主要有兩種方法:

第一種,直接運行cxfreeze.bat通過:

先進入cmd命令行,進入C:/Python31/Scripts目錄,然後運行cxfreeze.bat -h 就可以看到它的使用說明了。我們可以用cx_freeze自己的sample做個試驗。

進入到c:/python31/scripts/下,運行

cxfreeze C:/Python31/Lib/site-packages/cx_Freeze/samples/PyQt4/PyQt4app.py --install-dir=d:/123

pytqt4app.py就會被打包成exe,並且它所用到的庫文件,也被一併考到了d:/123目錄下。



第二種,方法,運行setup.py:

在cxfreeze附帶的例子 C:/Python31/Lib/site-packages/cx_Freeze/samples/PyQt4 中,有一個setup.py文件,打開這個文件,我們發現其內容為:

    import sys 
    from cx_Freeze import setup, Executable 
    base = None 
    if sys.platform == "win32": 
        base = "Win32GUI" 
    setup( 
            name = "simple_PyQt4", 
            version = "0.1", 
            description = "Sample cx_Freeze PyQt4 script", 
            executables = [Executable("PyQt4app.py", base = base)]) #PyQt4app.py即為要打包的文件 



通過運行這個腳本,就可以自動的完成打包工作:

比如,我們進入 C:/Python31/Lib/site-packages/cx_Freeze/samples/PyQt4目錄下,

運行

setup.py build

之後,在此目錄下會出現一個build/exe.win32-3.1目錄,該目錄下即可看到打包完成的exe文件了。我們要想對自己的腳本打包,將這個setup.py 拷貝過去,再將其中

executables = [Executable("PyQt4app.py", base = base)])

的PyQt4app.py改為自己的腳本名即可。



打包過程中出現的問題:

對中文支持的問題,如果腳本中存在中文,且編碼格式沒有特別指出,打包的過程中會出現: UnicodeDecodeError: 'utf8′ codec can't decode bytes in position 1602: invalid data 這類的錯誤,在http://www.cnblogs.com/xinzaitian/archive/2010/12/10/1902481.html這篇博文中,作者提到必須將中文刪除掉。

其實中文字符可以保留,只要在腳本文件的行首加上:

#!/usr/bin/env python

#coding=utf-8

就可以了

點擊生成的exe文件是否可以使用了!很爽吧!怎麼覺得啟動的時候後面有個黑糊糊的窗口不舒服?那你在生成命令裡面加個參數吧!加一個參數base-name設為 win32gui

例子:
    cxfreeze hello.py --target-dir dist --base-name=win32gui



另外的一個問題是,打包好的exe文件拿到 「桌面」或者別的中文路徑下運行,就會彈出一個窗口顯示cannot get zipimporter instance,這個到目前為止還沒有找到好的解決方法,從另一個網路文件發現到可以利用 winrar 來進行打包整個檔案變成單一的 exe 檔,或許這也是另一種解決方式。


留言

這個網誌中的熱門文章

c語言-關於#define用法

CMD常用網管指令

PHP 與 JavaScript 之間傳值利用 json