天天看點

将python3.1+pyqt4打包成exe

将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即為要打包的檔案  

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,這個到目前為止還沒有找到好的解決方法