1. 程式人生 > >Python指令碼打包為exe檔案

Python指令碼打包為exe檔案

Python指令碼和所用到的庫打包為exe檔案,可以更方便的釋出程式,避免使用程式的每個電腦都必須安裝Python。
網上有不少相關介紹,但很少見到Python 3.x下打包Python指令碼為exe的成功案例,筆者探索了一下,成功完成了任務,記錄下來分享給需要的朋友。歡迎交流。

一、Python 3.1的打包辦法

1、下載cx_Freeze。
http://sourceforge.net/projects/cx-freeze/files/
根據自己的系統型別和Python版本下載合適的型別,我下載的是:cx_Freeze-4.1.2.win32-py3.1.msi。
這個工具目前最新版本是2010.1.6號的,還挺新的。

2、安裝。
直接安裝下載的安裝包。
之後可以看到cxfreeze工具所在目錄如下:





3、打包。
我要打包的是BlogPost.py和它依賴的模組。
A、準備工作。
a、去除程式碼中所有中文字元,包括註釋。(指定編碼的註釋可以不去掉沒有關係)
b、如果用到類似lxml這樣的第三方庫,可能會出現找不到_elementpath模組的錯誤。需要在某個.py檔案中寫上import _elementpath as DONTUSE,並且指定該模組的搜尋路徑。(我的該模組所在路徑是:C:/Python25/Lib/site-packages/lxml /_elementpath.py)
B、命令列執行。
C:/Python31/Scripts/cxfreeze.bat --include-path=C:/Python25/Lib/site-packages/lxml --init-script=D:/Projects/Google/pyblogpost/2exe/BlogPost.py BlogPost.py
注意:
(1)--init-script指定的啟動檔案路徑必須用絕對路徑,否則會提示找不到init script。
(2)只能指定一個要打包的模組,也就是啟動模組。
(3)所有.py檔案都不能有中文字元,否則會出現編碼異常。
(4)執行上述命令後,在會生成dist目錄,裡面就有打包後的可執行檔案。
(5)釋出後,可執行檔案執行路徑不能有中文(最好也不要有空格)。而且最好釋出dist目錄所有檔案,我發現有時只發布打包後的exe是無法執行的。
(6)啟動執行的檔案中不要有下面這種判斷,否則可執行檔案執行會沒有任何效果。
if __name__ == "__main__":
main()
(7)如果沒有指定--include-path,或者沒有在某個.py檔案中寫上import _elementpath as DONTUSE,都會出現如下找不到_elementpath模組的錯誤:
D:/Projects/Google/pyblogpost/2exe/dist>BlogPost.exe
Traceback (most recent call last):
  File "D:/Projects/Google/pyblogpost/2exe/BlogPost.py", line 11, in <module>
    import BlogConfig
  File "BlogConfig.py", line 5, in <module>
  File "ExtensionLoader_lxml_etree.py", line 12, in <module>
  File "lxml.etree.pyx", line 39, in init lxml.etree (src/lxml/lxml.etree.c:1399
44)
ImportError: No module named _elementpath
(8)不能有中文,即使是註釋中也不能有,否則出現如下錯誤。
    codeString = fp.read()
  File "C:/Python31/lib/codecs.py", line 300, in decode
    (result, consumed) = self._buffer_decode(data, self.errors, final)
UnicodeDecodeError: 'utf8' codec can't decode bytes in position 557-558: invalid
data
嘗試把編碼由cp936改為utf-8,也不可以,把檔案中ASCII另存為UTF-8,也不行,有如下錯誤:
  File "BlogConfig.py", line 1
    /ufeff#!/usr/bin/python
      ^
SyntaxError: invalid character in identifier

4、補充說明另外一種打包方式。
第3點講的是通過命令列指定引數打包,也可以採用如下方式:
(1)新建setup.py檔案,內容大致如下:(我使用的是上述第3點講述的方法,沒有修改引數)
(2)在命令列執行:python setup.py build
這種打包方法,在cxfreeze工具的sample中也大量使用。

二、Python 2.x版本

上面的cx_Freeze同樣提供for Python 2.x的版本,用法我估計也差不多,不再贅述。
加上這一節,是記錄一下之前我用Python 2.x寫一個小工具用py2exe打包的過程。
先安裝py2exe工具。

然後用下面setup.py指令碼:

from distutils.core import setup
import py2exe
options = {"py2exe": {"bundle_files": 1}}     
setup(options = options,
      zipfile = None,
    console=["hello.py"],)

命令列執行:

C:/Python26/python.exe setup.py py2exe
就會在dist目錄生成單一的hello.exe檔案,這個檔案是可執行的。