Pyinstaller打包
上一篇的后續(xù),使用pyinstaller打包的一些注意事項(xiàng)。
文件目錄
?
打包目標(biāo)
生成一個(gè)資源可以替換、可以發(fā)布到別人電腦上的文件。
一些小小的注意事項(xiàng)
路徑問題
因?yàn)槭且粋€(gè)涉及到資源處理和文件操作的程序,所以資源文件和操作對(duì)象的路徑怎么寫就成了一個(gè)很關(guān)鍵的問題。
解決方法一:使用絕對(duì)路徑。沒有問題,但不能移植到別人的電腦上。
解決方法二:發(fā)布的是一個(gè)文件包,里面包含exe和資源文件、被操作文件,根據(jù)文件包中的架構(gòu)編寫相對(duì)路徑。
欲采用方法二。
方法二比較簡單,只是類似于前端中,由于js文件(A)是在html文件(B)中被引入的,因此,在A中寫調(diào)用資源文件C時(shí),要注意調(diào)用的相對(duì)路徑要基于B而不是A。同理,只要代碼中的相對(duì)路徑都是基于打包后生成的exe文件就好了。
Pyinstaller的參數(shù)問題:
-F 和 -D:
-F 會(huì)把程序和所有依賴的庫打包成一個(gè)可執(zhí)行文件,啟動(dòng)較慢;-D會(huì)生成一個(gè)文件夾,里面有可執(zhí)行文件和依賴的庫對(duì)應(yīng)的文件,啟動(dòng)較快。推薦使用-D,因?yàn)楦鶕?jù)網(wǎng)上的某篇文章,使用-F路徑會(huì)更麻煩(Python打包exe遇到的坑,路徑不對(duì),文件找不到,遞歸超過最大深度等_吃蘋果的程序猿的博客-CSDN博客)
-i
用于設(shè)置圖標(biāo)。被選為圖標(biāo)的圖像文件后綴名應(yīng)為ico(其實(shí)只要下載一張圖片,更改其后綴就好,這個(gè)方法對(duì)大多數(shù)格式都適用)。圖標(biāo)文件的相對(duì)路徑要基于打包時(shí)所處的目錄來寫,我一般把圖標(biāo)文件和要被打包的py文件放在一個(gè)目錄下,因此直接寫圖標(biāo)文件的名稱即可。
-c 和 -w:
-c對(duì)應(yīng)cmd,帶控制臺(tái)窗口。-w對(duì)應(yīng)windows,一般用在自帶圖形界面GUI的程序上,或者不想太初控制臺(tái)窗口時(shí)。
如果代碼中有print語句但exe程序不帶控制臺(tái)窗口,可能會(huì)報(bào)錯(cuò)。
控制臺(tái)閃退
程序運(yùn)行完成后,控制臺(tái)會(huì)自己關(guān)閉。
應(yīng)對(duì)方法一:引入time包,代碼末尾加
time.sleep()應(yīng)對(duì)方法二:代碼末尾加
input('請(qǐng)按任意鍵退出')我個(gè)人的理解是,input會(huì)等待一個(gè)鍵盤輸入,在鍵盤按鍵被按下前,程序不算執(zhí)行完,控制臺(tái)自然不會(huì)消失。(以上兩種方法摘自下面的博客Python打包exe遇到的坑,路徑不對(duì),文件找不到,遞歸超過最大深度等_吃蘋果的程序猿的博客-CSDN博客
)
打包流程
首先下載安裝pyinstaller。
pip install pyinstaller安裝完成后,打開cmd,進(jìn)入要被打包的文件(本文是main_4)所在的目錄。
首先輸入D:進(jìn)入D盤(如果要進(jìn)入E盤則是E:),然后輸入cd+' '+文件所在路徑。
這個(gè)程序是帶圖形界面的,因此在-w和-c中選擇-w。
并不想把所有的依賴庫都打包進(jìn)一個(gè)exe文件(這樣似乎不太好處理被調(diào)用/操作的外部文件),所以在-D和-F中選擇-D(這里可以不寫,因?yàn)槟J(rèn)選擇-D)。
欲設(shè)置圖標(biāo),選擇R-C.ico為圖標(biāo)文件。
在cmd中輸入如下命令:
pyinstaller -w -i R-C.ico main_4.py開始打包,時(shí)間較長。
完成后,出現(xiàn)Build、dist文件夾及spec文件。
打包完成后,根據(jù)之前在原始代碼中寫入的資源/被操作文件的路徑,把對(duì)應(yīng)文件放到對(duì)應(yīng)的位置(本文中為在dist目錄下新建source文件夾,并將對(duì)應(yīng)資源放入其中)。
之后,在dist中的main_4文件夾下找到main_4.exe文件,雙擊運(yùn)行,發(fā)現(xiàn)沒有問題。
將dist文件移動(dòng)到其他位置,其中的exe文件仍能正常運(yùn)行。
Over!
其他問題
打包后體積過大
可能是引入的包過多,或者當(dāng)前環(huán)境下下載的包過多。
解決方案一:減少引入,能from xxx import xxx,就不要import xxx。(本次然并卵了,用list代替了ndarray,沒有引入numpy,但包的大小基本一致……)
解決方案二:創(chuàng)建虛擬環(huán)境,在其中之下必須的包,在虛擬環(huán)境下打包。
不理解spec文件和Build文件夾的作用
理論上來講spec文件是用來配置各種路徑的。
總結(jié)
以上是生活随笔為你收集整理的Pyinstaller打包的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C# vb .net实现胶片效果滤镜
- 下一篇: 扫描二维码进小程序指定页面