使用Pyinstaller來打包自己開發的軟件時遇到的幾個問題及解決方法。工具主要功能是數據分析,使用機器學習算法完成數據訓練和預測功能。主要用到了兩個學習庫keras和sklearn,所以說在打包時出現的問題無非是sklearn和keras的后端TensorFlow在打包運行過程出錯的問題。
注意:靈活使用Pyinstaller的參數,在首次使用pyinstaller -F xxx.py生成的xxx.exe運行出現錯誤的時候,可以以debug的模型重新編譯,即
pyinstaller -F -D xxx.py來打包,便於調試使用。
打包完成后會在指定目錄下生成文件夾build和dist,還有xxx.spec文件。我們可以在cmd中運行dist中的xxx.exe文件,這樣我們能夠在cmd窗口中查看錯誤信息。言歸正傳,下面是遇到的幾種問題。
1、缺少dll、so、其它文件。
解決方法:既然缺少某個文件,那么我們就告訴他缺少的文件在哪里。
第一種:我們是以debug的形式打包,即參數中加入的-D。
在cmd中的錯誤提示中會顯示程序在某個路徑下找不到文件,那么我們就在電腦中找到這個文件並放到指定路徑下。比如圖片顯示程序運行錯誤的原因是找不到VERSION這個文件(ps:這個文件中只是包含了astor這個庫的版本信息,當然這個庫是干什么用的我也不知道,估計是別的庫的依賴吧),那么我就在run文件夾創建了astor這個文件夾,然后把VERSION放進去即可。
第二種:打包不加入debug或者只生成xxx.exe文件時,我們需要把缺少的文件打包到xxx.exe中。
Pyinstaller打包參數有 --add-data這個參數,我們使用這個參數指定文件的位置以及打包的位置。還是上面的錯誤,VERSION文件在我的電腦桌面上,即C:\Users\Desktop\VERSION,那么打包時告訴程序文件的位置:
pyinstaller -F --add-data="C:\Users\Desktop\VERSION;astor" xxx.py # --add-data="文件位置;缺失文件位置(注意這里是相對路徑,即相對於程序)"
作者發現:第二種情況打包生成的xxx.exe運行時會在TMP目錄下生成一個臨時文件,這個臨時文件存放着python的一些庫文件,如果我們將缺失的數據包成功打包到xxx.exe的話會在這個臨時文件相應目錄下找到。如下圖所示,_MEI42082是運行xxx.exe臨時生成文件夾,此時,我們去這個文件夾中目錄可以找到astor這個文件了。
總之缺少什么文件就給他指定位置。
2、缺少模塊
如果出現像上圖一樣類似的問題即缺少模塊的話,通過Pyinstaller命令在打包的時候指定。
pyinstaller -F --hidden-import="numpy.core._dtype_ctypes" xxx.py