cx_freeze將python文件打包成exe的全流程及遇到的問(wèn)題

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末妖谴,一起剝皮案震驚了整個(gè)濱河市窿锉,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌窖维,老刑警劉巖榆综,帶你破解...
    沈念sama閱讀 218,525評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異铸史,居然都是意外死亡鼻疮,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,203評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門琳轿,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)判沟,“玉大人耿芹,你說(shuō)我怎么就攤上這事∨埠澹” “怎么了吧秕?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,862評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)迹炼。 經(jīng)常有香客問(wèn)我砸彬,道長(zhǎng),這世上最難降的妖魔是什么斯入? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,728評(píng)論 1 294
  • 正文 為了忘掉前任砂碉,我火速辦了婚禮,結(jié)果婚禮上刻两,老公的妹妹穿的比我還像新娘增蹭。我一直安慰自己,他們只是感情好磅摹,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,743評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布滋迈。 她就那樣靜靜地躺著,像睡著了一般户誓。 火紅的嫁衣襯著肌膚如雪饼灿。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,590評(píng)論 1 305
  • 那天厅克,我揣著相機(jī)與錄音赔退,去河邊找鬼。 笑死证舟,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的窗骑。 我是一名探鬼主播女责,決...
    沈念sama閱讀 40,330評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼创译!你這毒婦竟也來(lái)了抵知?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,244評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤软族,失蹤者是張志新(化名)和其女友劉穎刷喜,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體立砸,經(jīng)...
    沈念sama閱讀 45,693評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡掖疮,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,885評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了颗祝。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片浊闪。...
    茶點(diǎn)故事閱讀 40,001評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡恼布,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出搁宾,到底是詐尸還是另有隱情折汞,我是刑警寧澤,帶...
    沈念sama閱讀 35,723評(píng)論 5 346
  • 正文 年R本政府宣布盖腿,位于F島的核電站爽待,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏翩腐。R本人自食惡果不足惜堕伪,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,343評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望栗菜。 院中可真熱鬧欠雌,春花似錦、人聲如沸疙筹。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,919評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)而咆。三九已至霍比,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間暴备,已是汗流浹背悠瞬。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,042評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留涯捻,地道東北人浅妆。 一個(gè)月前我還...
    沈念sama閱讀 48,191評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像障癌,于是被迫代替她去往敵國(guó)和親凌外。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,955評(píng)論 2 355