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

在「開源圖像標註工具labelme的安裝使用及漢化」這篇博客中,使用pyinstaller將labelme項目的入口python文件main.py打包,生成了main.exe文件,能夠在Windows操做系統中直接運行,獲得labelme圖像標註工具軟件界面,生成exe的過程當中,碰到了一些問題,有的解決了,有的尚未解決,但願對從事這方面工做的朋友有幫助,也但願熟悉這類問題的大神們幫着解決下尚未解決的問題。python

1 exe文件閃退問題windows

將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就會運行,下面就會顯示報錯信息。ui

 

 

根據報錯信息,能夠看到,問題出在config/__init__.py文件上,軟件啓動須要讀取default_config.yaml文件,這個文件就是在config目錄下,生成exe文件以後,軟件就找不到這個文件,咱們去查看__init__.py的代碼,找到一行代碼,是讀取default_config.yaml文件的。url

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

此處的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軟件界面,閃退問題解決。rest

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位程序的問題。經過測試不一樣的提示信息,找到解決方法。

相關文章
相關標籤/搜索