在“開源圖像標注工具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位程序的問題。通過測試不同的提示信息,找到解決方法。