利用pyinstaller生成exe文件碰到的一些問題及解決方法


在“開源圖像標注工具labelme的安裝使用及漢化”這篇博客中,使用pyinstaller將labelme項目的入口python文件main.py打包,生成了main.exe文件,可以在Windows操作系統中直接運行,得到labelme圖像標注工具軟件界面,生成exe的過程中,碰到了一些問題,有的解決了,有的還沒有解決,希望對從事這方面工作的朋友有幫助,也希望熟悉這類問題的大神們幫着解決下還沒有解決的問題。

1 exe文件閃退問題

將labelme在pycharm中運行,直接運行main.py文件,可以正常運行,能夠得到labelme的標注軟件界面,說明程序能夠正常運行。然后,使用pyinstall工具,在cmd的命令行中利用pyinstaller -F E:/ python_workspace/labelme/main.py生成main.exe文件,命令鍵入之后,需要耐心等待1-2分鍾,直到出現Building EXE from EXE-00.toc completed successfully出現,說明exe文件生成成功了。

 

 

然后直接雙擊mian.exe,結果出現一個cmd窗口,很快就閃退了,labelme界面沒有出現,cmd的報錯信息也沒有看到。

為了看到報錯信息,我在cmd中,cd到main.exe所在的目錄,然后直接鍵入main.exe,這時候main.exe就會運行,下面就會顯示報錯信息。

 

 

根據報錯信息,可以看到,問題出在config/__init__.py文件上,軟件啟動需要讀取default_config.yaml文件,這個文件就是在config目錄下,生成exe文件之后,軟件就找不到這個文件,我們去查看__init__.py的代碼,找到一行代碼,是讀取default_config.yaml文件的。

config_file = osp.join(here, 'default_config.yaml')

此處的here是軟件運行時的一個路徑,os.path.join的路徑,我們可以將這個路徑寫成絕對路徑,比如我們直接將default_config.yaml文件放到d盤的labelme目錄下,將以上代碼修改為

#config_file = osp.join(here, 'default_config.yaml')
path = 'd:\\labelme'
config_file = osp.join(path, 'default_config.yaml')

再次使用pyinstaller,生成main.exe文件。

雙擊運行main.exe文件,可以進入labelme軟件界面,閃退問題解決。

2 圖標未顯示問題

在icon中有一些圖標,使用pycharm運行main.py可以正常顯示圖標,生成exe文件之后,圖標都不能正常顯示。

main.exe運行結果

 

 

在pycharm中的運行結果

 

 

查資料可知,應該是pyinstaller的問題,在轉換為exe文件的時候將圖片數據丟失了。

解決辦法是使用base64來保存這些圖標文件,這樣在pyinstaller轉化exe文件的時候,就不會存在處理圖片的問題。這個方法,我沒有通過實踐測試,理論上是可行的,不過,我沒有驗證。

網上也有一些介紹打包圖標的博客,修改圖標的路徑,打包的時候可以直接將圖標打包到可執行文件中,該方法也沒有測試驗證。

3 某些機器不能運行的問題

生成的main.exe文件和default_config.yaml文件,都放到labelme文件夾中,然后將labelme文件夾拷貝到d盤根目錄下,在多台計算機上測試運行。

3.1 雙擊運行main.exe

都是在windows系統64位機器上測試的,有的機器能夠正常運行,有的機器報錯。報錯信息是“此應用無法在你的電腦上運行,若要找到適用於你的電腦的版本,請咨詢軟件發布者。”嘗試解決,在百度中查找相關報錯信息,提示是兼容性問題,點擊右鍵,選擇屬性,在兼容性中勾選兼容運行,依然報錯。

3.2 右鍵以管理員身份運行

提示“windows找不到文件main.exe。請確定文件名是否正確后,再試一次。” ,在百度中查找windows找不到文件等信息,采取了一些方法,比如利用sfc /scannow命令,掃描修復系統,執行后,main.exe依然不能打開。

3.3 在命令行運行

在cmd中,cd到labelme路徑下,直接鍵入main.exe,報錯信息為16位程序不能運行,系統將main.exe看作了16位的程序,阻止了程序的運行。然后查找不支持16位應用程序的解決辦法,點擊開始菜單,點擊運行,輸入gpedit.msc。選擇計算機配置,選擇管理模板,點擊windows組件,點擊應用程序兼容性。雙擊防止訪問16位應用程序,點擊已禁止,點擊確定。我使用的筆記本上面是win10系統家庭版,還不能運行gpedit.msc,還需要查找,先解決運行組策略的問題。在記事本中,輸入一下內容:

 @echo off

  pushd "%~dp0"

  dir /b %systemroot%\Windows\servicing\Packages\Microsoft-Windows-GroupPolicy-ClientExtensions-Package~3*.mum >gp.txt

  dir /b  %systemroot%\servicing\Packages\Microsoft-Windows-GroupPolicy-ClientTools-Package~3*.mum >>gp.txt

  for /f %%i in ('findstr /i . gp.txt 2^>nul') do dism /online /norestart /add-package:"%systemroot%\servicing\Packages\%%i"

  pause

說明:通過dir命令遍歷系統盤servicing目錄,尋找組策略的配置包,找到后寫入到gp.txt文件,然后通過dism命令來安裝組策略包。

然后將文件另存為gpedit.bat文件,然后運行,這樣就把組策略加入到系統中了。

4 結語

出現報錯信息,可以采用多種方式運行程序,這樣程序會呈現不一樣的錯誤提示信息,有的錯誤提示信息很有用,比如閃退問題,在命令行運行,就會有一些有用的錯誤提示信息,最后exe不能運行的解決,也是在命令行運行,提示了16位程序的問題。通過測試不同的提示信息,找到解決方法。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM