2024年6月18日 星期二

pyinstaller 打包 mmcv 相關的 exe 可能會遇到的問題

打包完後要執行時遇到了一個問題如下

FileNotFoundError: [Errno 2] No such file or directory: '/home/XXX/tmp-dir/_MEIkGapxs/yapf_third_party/_ylib2to3/Grammar.txt'

上網查到了這篇

https://blog.csdn.net/weixin_44243859/article/details/131890088

為了怕以上連結失效,這邊稍微重複一下內容

說是 pyinstaller 沒有自帶該第三方庫文件的hook的時候,就會導致這個包文件不被打包進來,解決辦法,寫個 hook,然後放進 pyinstaller 的 hooks 裡面,hook 文件的命名規範為: hook-yapf_third_party.py

from PyInstaller.utils.hooks import collect_data_files datas = collect_data_files("yapf_third_party")

以上就是這個 .py 的內容

但具體來說我還是不知道怎麼做

於是再查到了這篇

https://blog.csdn.net/cliffordl/article/details/138065845

看了這篇之後就明白很多

如果我要打包 main.py,然後我要讓他去 hook 一些 library

那我就在 main.py 旁邊開一個 hooks 資料夾

然後把上面的 hook-yapf_third_party.py 丟進這個資料夾

(其中 hook-xxx.py 的 xxx 就是 library 名稱)

然後在打包時加入 --additional-hooks-dir ./hooks

所以整個打包的指令就變成 

pyinstaller -F -c --additional-hooks-dir ./hooks main.py

這個問題這樣就解決了,然後接下來又遇到

ModuleNotFoundError: No module named 'mmcv._ext'

繼續上網查,發現這篇

https://blog.csdn.net/gc5218112/article/details/125172123

OK,他說要在 hiddenimports 加入 'mmcv', 'mmcv._ext'

找到 main.spec,照著加進去,然後執行

pyinstaller main.spec

問題也確實解決了,但這樣很不方便,我希望可以不要去改 .spec

所以這個命令可以寫成

pyinstaller -F -c --additional-hooks-dir ./hooks --hidden-import mmcv --hidden-import mmcv._ext main.py

這樣全部的問題都解決了,大功告成


沒有留言:

張貼留言