使用py2exe打包python腳本(except 2.6)

 

使用py2exe打包python腳本(except 2.6) 收藏

 一、簡介

py2exe是一個將python腳本轉換成windows上的可獨立執行的可執行程序(*.exe)的工具,這樣,你就可以不用裝python而在windows系統上運行這個可執行程序。

py2exe已經被用於創建wxPython,Tkinter,Pmw,PyGTK,pygame,win32com client和server,和其它的獨立程序。py2exe是發佈在開源許可證下的。

二、安裝py2exe

從 http://prdownloads.sourceforge.net/py2exe下載並運行與你所安裝的Python對應的py2exe版本的 installer,這將安裝py2exe和相應的例子;這些例子被安裝在lib/site-packages/py2exe/samples目錄下。

三、py2exe的用法

如果你有一個名爲myscript.py的python腳本,你想把它轉換爲運行在 windows上的可執行程序,並運行在沒有安裝python的 windows系統上,那麼首先你應寫一個用於發佈程序的設置腳本例如mysetup.py,在其中的setup函數前插入語句import py2exe 。
mysetup.py示例如下:
# mysetup.py
from distutils.core import setup
import py2exe

setup(console=["myscript.py"])
然後按下面的方法運行mysetup.py:
python mysetup.py py2exe
上面的命令執行後將產生一個名爲dist的子目錄,其中包含了myscript.exe,python24.dll,library.zip這些文件。
如果你的myscript.py腳本中用了已編譯的C擴展模塊,那麼這些模塊也會被拷貝在個子目錄中,同樣,所有的dll文件在運行時都是需要的,除了系統的dll文件。
dist子目錄中的文件包含了你的程序所必須的東西,你應將這個子目錄中的所有內容一起發佈。

默認情況下,py2exe在目錄dist下創建以下這些必須的文件:
1、一個或多個exe文件。
2、python##.dll。
3、幾個.pyd文件,它們是已編譯的擴展名,它們是exe文件所需要的;加上其它的.dll文件,這些.dll是.pyd所需要的。
4、一個library.zip文件,它包含了已編譯的純的python模塊如.pyc或.pyo
上面的mysetup.py創建了一個控制檯的myscript.exe程序,如果你要創建一個圖形用戶界的程序,那麼你只需要將mysetup.py中的console=["myscript.py"]替換爲windows=["myscript.py"]既可。

py2exe一次能夠創建多個exe文件,你需要將這些腳本文件的列表傳遞給console或windows的關鍵字參數。如果你有幾個相關聯的腳本,那麼這是很有用的。
運行下面個命令,將顯示py2exe命令的所有命令行標記。
python mysetup.py py2exe --help

四、指定額外的文件
一些應用程序在運行時需要額外的文件,諸如配置文件、字體、位圖。
如果在安裝腳本中用data_files可選項指定了那些額外的文件,那麼py2exe能將這些文件拷貝到dist子目錄中。data_files應包含一個元組(target-dir, files)列表,其中的files是這些額外的文件的列表。
示例如下:
# mysetup.py
from distutils.core import setup
import glob
import py2exe

setup(console=["myscript.py"],
data_files=[("bitmaps",
["bm/large.gif", "bm/small.gif"]),
("fonts",
glob.glob("fonts//*.fnt"))],
)
說明:data_files選項將創建一個子目錄dist/bitmaps,其中包含兩個.gif文件;一個子目錄dist/fonts,其中包含了所有的.fnt文件。

五、Windows NT services

你可以通過傳遞一個service關鍵字參數給setup函數來建造Windows NT services
,這個service參數的值必須是一個Python模塊名(包含一service類)的列表。
示例如下:
# mysetup.py
from distutils.core import setup
import py2exe

setup(service=["MyService"])
所建造的可執行的service是可以通過在其後跟一定的命令行參數標記來自行安裝和卸載的。你可以通過在這個可執行的service(exe)後跟一-help參數來得到更多的幫助。
六、COM servers

你可以通過傳遞一個com_server 關鍵字參數給setup函數來建造Windows NT services
,這個service參數的值必須是一個Python模塊名(包含一個或多個COM server 類)的列表。
示例如下:
# mysetup.py
from distutils.core import setup
import py2exe

setup(com_server=["win32com.server.interp"])
默認情況下,DLL和EXE servers被建造,你不需要它們的話你可以簡單的刪除它們。

儘量別使用 Py2exe for Python 2.6

Py2exe 是用來將 Python 程序打包成 Windows 下可執行 exe 程序的工具。這樣那些未安裝 Python 開發環境的用戶就可以直接使用 Python 寫的軟件了。

Py2exe 並不是把 Python 程序編譯成 Windows 的原生程序,而是將運行 Python 所需的 dll, lib 等打包到一起供 Python 程序使用。一個很短的 Python 程序往往會生成幾兆的軟件包。因此 Py2exe 打包程序的執行效率並不會有提升,只是方便初級 Windows 用戶使用罷了。

除了 Py2exe 之外,還有一些其它的 Python 到 exe 的打包程序,比如 Pyinstaller、cx_Freeze 等。它們在某些情況下表現比 Py2exe 要好,但是在兼容性和用戶羣支持上不如 Py2exe(一家之見)。

前兩天我圖新鮮,把 Windows 中的 Python 升級到了 2.6,PyGtk 和 Py2exe 也隨之升級到了支持 2.6 的版本。然後問題就來了,用 Py2exe for Python 2.6 打包的 PyGtk 程序在打包的機器上運行正常,但拷貝到部分人的 Windows 中後卻無法運行,點擊就出現“由於應用程序配置不正確,應用程序未能啓動。重新安裝應用程序可能會糾正這個問題。”

剛開始我以爲是 Win 下 GTK 庫 dll 的問題,反覆地驗證幾次覺得應該問題不在 GTK 上。如果缺少外部庫,Python 應該報缺少 dll 問題,而不是應用程序出錯。懷疑是缺少微軟的庫,用 PE Explorer 試用版在出問題的電腦上掃描一下應用程序的依賴關係,發現缺少 msvcr90.dll,將 msvcr90.dll 拷貝到程序包中,再掃描依賴關係,所有的 dll 已經都滿足了,仍然報出同樣的錯誤。

後來基本確定是 Python 2.6 的問題。因爲 Python 2.6 是使用 Microsoft Visual C++ 2008 編譯的,所以要想 py2exe for 2.6 打包的程序運行,目標機器上必須裝有 Python 2.6 或者 Microsoft Visual C++ 2008 Redistributable Package。 否則系統就無法識別 exe 程序的 CRT, 因而它就成爲無法運行的程序。

之所以程序在一部分人的機器上運行正常,是因爲這些人 Windows 中安裝了 VC2008 開發套件,自然也就包括了 VC2008 運行時庫。

因爲我們發佈程序時無法強制每個人都去安裝 Microsoft Visual C++ 2008 Redistributable Package,所以需要發佈 exe 程序時,還是使用老版本的 Python 2.5 和 Py2exe for Python 2.5,別使用 Python 2.6 爲好。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章