把Python腳本和所用到的庫打包爲exe文件,能夠更方便的發佈程序,避免使用程序的每一個電腦都必須安裝Python。
網上有很多相關介紹,但不多見到Python 3.x下打包Python腳本爲exe的成功案例,筆者探索了一下,成功完成了任務,記錄下來分享給須要的朋友。歡迎交流。
1、Python 3.1的打包辦法
二、安裝。
直接安裝下載的安裝包。
以後能夠看到cxfreeze工具所在目錄以下:python
三、打包。
我要打包的是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
四、補充說明另一種打包方式。
第3點講的是經過命令行指定參數打包,也能夠採用以下方式:
(1)新建setup.py文件,內容大體以下:(我使用的是上述第3點講述的方法,沒有修改參數)
(2)在命令行執行:python setup.py build
這種打包方法,在cxfreeze工具的sample中也大量使用。
2、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文件,這個文件是可執行的。