首先施流,cx_freeze真是個(gè)好工具踪宠,讓我這種沒(méi)有編程基礎(chǔ)的技術(shù)渣有朝一日也能搞出個(gè)小程序來(lái)冲泥,贊贊贊窘茁。
將python文件打包成exe程序怀伦,主要是為了把自己寫(xiě)的python程序方便的普及給那些電腦上沒(méi)有安裝python軟件的用戶用。
安裝過(guò)程遇到了好多問(wèn)題庙曙,一一記錄下來(lái)空镜,方便其他遇到這些問(wèn)題的人看看。
第一步:安裝cx_freeze
如果在有網(wǎng)的環(huán)境安裝,可以直接pip install xxx吴攒,我是要在離線環(huán)境下安裝张抄,所以一般會(huì)去pypi的官網(wǎng)下載whl文件,然后在cmd中安裝洼怔。
官網(wǎng)下載地址:https://pypi.org/project/cx_Freeze署惯,注意要找到和python版本對(duì)應(yīng)的cx_freeze版本,我是安裝的Anaconda3,對(duì)應(yīng)的python是3.6的版本镣隶,下載的是cx_Freeze-5.1.1-cp36-cp36m-win_amd64.whl這個(gè)文件极谊。
下載后在cmd默認(rèn)路徑中輸入:pip install cx_freeze,頁(yè)面會(huì)顯示是否成功install安岂,如果提示cxfreeze不是內(nèi)部或外部命令轻猖,可以通過(guò)以下方式解決:打開(kāi)python安裝文件的Scripts文件夾,在此目錄下新建一個(gè)txt文檔域那,輸入以下內(nèi)容:
@ echo off
你的python路徑\python.exe 你的python路徑\Scripts\cxfreeze %*
比如咙边,我的是輸入以下:
@echo off
C:\Program Files (x86)\Anaconda3\python.exe C:\Program Files (x86)\Anaconda3\Scripts\cxfreeze %*
然后將txt格式改為bat,再重新在cmd中輸入pip install cx_freeze次员。 一般成功后會(huì)在頁(yè)面看到successfully installed之類的話败许,如果不確定的話,可以在cmd默認(rèn)路徑中輸入:cxfreeze -h或者cxfreeze?--version淑蔚,如果出現(xiàn)cxfreeze相應(yīng)的信息市殷,代表安裝完成。
第二步:正式的py—>exe過(guò)程
對(duì)于簡(jiǎn)單的py腳本刹衫,據(jù)說(shuō)可以通過(guò)以下方法進(jìn)行轉(zhuǎn)換:在cmd中切換目錄到python安裝文件的Scripts文件夾醋寝,輸入:cxfreeze D:\change\hello.py --target-dir D:\change\changedexe,其中绪妹,D:\change\hello.py是你要轉(zhuǎn)換成exe的python腳本的目錄甥桂,D:\change\changedex是你要放的exe的目錄。
順利的話會(huì)生成exe的程序邮旷,但是我的又報(bào)錯(cuò)了黄选,錯(cuò)誤為:KeyError: 'TCL_LIBRARY',解決辦法是在要轉(zhuǎn)換成exe的python腳本的同目錄下加一個(gè)setup.py的啟動(dòng)腳本婶肩,并在腳本中添加以下內(nèi)容:
import os
os.environ['TCL_LIBRARY']="C:\Program Files (x86)\Anaconda3\tcl\tcl8.6"
os.environ['TK_LIBRARY']="C:\Program Files (x86)\Anaconda3\tcl\tk8.6"
其中办陷,C:\Program Files (x86)\Anaconda3是你python安裝的目錄。其實(shí)添加一個(gè)setup.py好處很多律歼,一方面可以幫你解決很多bug民镜,一方面可以生成一個(gè)可供安裝的msi文件,如果直接將py轉(zhuǎn)換成exe险毁,在生成exe文件的同時(shí)制圈,會(huì)產(chǎn)生好多exe所依賴的文件们童,內(nèi)存占的也比較大,不方便普及給別人鲸鹦,但是安裝的msi文件就很友好了慧库,體積比較小,而且只有一個(gè)文件馋嗜,很方便發(fā)給別人齐板。
一個(gè)完整的setup.py文件一般包括以下信息:
import os
os.environ['TCL_LIBRARY']="C:\Program Files (x86)\Anaconda3\tcl\tcl8.6"
os.environ['TK_LIBRARY']="C:\Program Files (x86)\Anaconda3\tcl\tk8.6"
from cx_Freeze import setup, Executable
options = { 'build_exe': { 'excludes': ['gtk', 'PyQt4', 'Tkinter'], 'packages': ['pandas', 'numpy', 'scipy'], 'includes': ['scipy.spatial.ckdtree'], } }
executables = [ Executable(D:\change\hello.py ) ] setup(name='hello', version = '1.0', description =?‘’, options=options, executables = executables)
一般setup.py寫(xiě)到這種程度應(yīng)該就能成功運(yùn)行了,在cmd中切換到setup.py所在的目錄中葛菇,輸入:python setup.py bdist_msi甘磨,會(huì)在setup.py所在的目錄中生成兩個(gè)文件夾,dist文件夾中包含一個(gè)msi文件眯停,點(diǎn)擊安裝后會(huì)生成build文件中的內(nèi)容济舆,build文件中包含exe文件和所依賴的各種文件。
我在寫(xiě)setup.py的過(guò)程中也遇到了不少報(bào)錯(cuò)庵朝,表現(xiàn)出來(lái)的形式是在雙擊exe文件后吗冤,黑框一閃而過(guò)又厉,并沒(méi)有成功運(yùn)行完python文件九府,于是在cmd中查找具體原因,查找方法是在cmd中切換到build文件夾下的exe.win-amd64-3.6覆致,輸入生成的exe文件侄旬,就是上面加粗的name的exe,我的是叫hello.exe煌妈,執(zhí)行后會(huì)報(bào)具體的錯(cuò)誤儡羔,如:
?import error: Missing required dependencies ['numpy'?]
Import Error: No module named ‘scipy‘
這里的['numpy' ]有可能是其他的python包,解決辦法就是在setup.py文件的options里加上報(bào)錯(cuò)的包璧诵,見(jiàn)上面加粗的部分汰蜘,還有一種報(bào)錯(cuò):
ImportError: No module named 'scipy.spatial.ckdtree'
解決辦法是在setup.py的options的include中加上'scipy.spatial.ckdtree',并找到打包后的build文件中的cKDTree.cp36-win_amd64.pyd文件之宿,我的路徑是D:\change\build\exe.win-amd64-3.6\lib\scipy\spatial族操,將cKDTree.cp36-win_amd64.pyd改為ckdtree.cp36-win_amd64.pyd即可。
寫(xiě)好setup.py后比被,在它的目錄下運(yùn)行python setup.py bdist_msi即可生成dist和安裝后的build文件色难。
至此,所有的bug都解決啦等缀,小程序可以開(kāi)心的運(yùn)轉(zhuǎn)起來(lái)了枷莉,轉(zhuǎn)圈圈~
嗚嗚嗚~~~以上只能保證生成的程序在我自己的電腦上順利運(yùn)行,在沒(méi)有安裝python的環(huán)境中還是報(bào)了不少錯(cuò)誤尺迂,修改報(bào)錯(cuò)都快改瘋了笤妙,于是我打算試試用pyinstaller去打包冒掌,也是遇到了好多問(wèn)題,但是我已經(jīng)沒(méi)有耐心去解決了蹲盘,甚至我還嘗試使用了py2exe宋渔,更是不好用,最后還是堅(jiān)持使用cx_freeze辜限,找到報(bào)錯(cuò)的問(wèn)題一個(gè)一個(gè)解決皇拣。
剛開(kāi)始在別人的電腦上報(bào)的錯(cuò)是沒(méi)有依賴包的環(huán)境,大概是no dependency of numpy啥的薄嫡,但是我的安裝包解壓后明明就含有numpy的包氧急。解決辦法是在我的電腦上把numpy包卸載后重新安裝了一個(gè)對(duì)應(yīng)版本的whl文件,接著生成msi文件毫深,放到別人電腦上一運(yùn)行吩坝,numpy不再報(bào)錯(cuò),方法可行哑蔫,再接著把所有涉及到的包都全部安裝一下钉寝,在別人電腦上就不會(huì)有環(huán)境相關(guān)的問(wèn)題報(bào)錯(cuò)了。
還有一個(gè)報(bào)錯(cuò)是multiprocessing.Pool相關(guān)的闸迷,不記得具體的了嵌纲,大概是說(shuō)multiprocessing中沒(méi)有Pool的,我搜了搜腥沽,網(wǎng)上并沒(méi)有相關(guān)的解決辦法逮走,但是我已經(jīng)找到了解決這類報(bào)錯(cuò)的大致方法啦,打開(kāi)msi安裝后的文件夾今阳,找到multiprocessing包的文件夾师溅,里面有一個(gè)名字為Pool.pyc的文件,將其改為pool.pyc即可盾舌。
恩墓臭,現(xiàn)在小程序可以在別人的電腦上順利運(yùn)行了,撒花給堅(jiān)持不懈大戰(zhàn)報(bào)錯(cuò)的我~~~