首先,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ò)的我~~~