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